Add server-sent game messages

This commit is contained in:
lcdr
2020-06-29 12:54:51 +02:00
parent cf92c30539
commit 4feb9dbc01
5 changed files with 1146 additions and 60 deletions
File diff suppressed because it is too large Load Diff
+4
View File
@@ -1,3 +1,5 @@
mod gm;
use std::io::Read;
use std::io::Result as Res;
@@ -7,6 +9,7 @@ use lu_packets_derive::FromVariants;
use crate::common::{ObjId, LuStr33, LuWStr33};
use super::{Vector3, ZoneId};
use self::gm::SubjectGameMessage;
pub type LuMessage = crate::general::client::LuMessage<ClientMessage>;
pub type Message = crate::raknet::client::Message<LuMessage>;
@@ -26,6 +29,7 @@ pub enum ClientMessage {
CharacterListResponse(CharacterListResponse) = 6,
CharacterCreateResponse(CharacterCreateResponse) = 7,
CharacterDeleteResponse(CharacterDeleteResponse) = 11,
SubjectGameMessage(SubjectGameMessage) = 12,
TransferToWorld(TransferToWorld) = 14,
BlueprintLoadItemResponse(BlueprintLoadItemResponse) = 23,
FriendRequest(FriendRequest) = 27,
+46
View File
@@ -0,0 +1,46 @@
use lu_packets_derive::GameMessage;
use crate::common::{ObjId, OBJID_EMPTY};
use super::{Lot, LOT_NULL};
#[derive(Debug, GameMessage)]
pub struct EquipInventory {
#[default(false)]
pub ignore_cooldown: bool,
pub out_success: bool,
pub item_to_equip: ObjId,
}
#[derive(Debug, GameMessage)]
pub struct UnEquipInventory {
#[default(false)]
pub even_if_dead: bool,
#[default(false)]
pub ignore_cooldown: bool,
pub out_success: bool,
pub item_to_unequip: ObjId,
#[default(OBJID_EMPTY)]
pub replacement_object_id: ObjId,
}
#[derive(Debug, GameMessage)]
pub struct MoveInventoryBatch {
#[default(false)]
pub allow_partial: bool,
#[default(false)]
pub out_success: bool,
#[default(1)]
pub count: u32,
#[default(0)]
pub dst_bag: i32, // todo: type
#[default(LOT_NULL)]
pub move_lot: Lot,
#[default(OBJID_EMPTY)]
pub move_subkey: ObjId,
#[default(false)]
pub show_flying_loot: bool,
#[default(0)]
pub src_bag: i32, // todo: type
#[default(OBJID_EMPTY)]
pub start_object_id: ObjId,
}
+61 -3
View File
@@ -1,5 +1,6 @@
pub mod client;
pub mod server;
pub mod gm;
use std::cmp::PartialEq;
use std::io::{Read, Write};
@@ -13,14 +14,68 @@ use crate::common::{LuVarStr, LuVarWStr};
type GmString = LuVarStr<u32>;
type GmWString = LuVarWStr<u32>;
#[derive(Debug, Deserialize, Serialize, PartialEq, GmParam)]
#[repr(u32)]
pub enum InventoryType {
Default,
Bank,
Brick,
ModelsInBbb,
TempEquip,
Model,
ModuleInUse,
Behavior,
Property,
BrickInBbb,
Vendor,
Buyback,
Quest,
Donation,
BankModel,
BankBehavior,
}
#[derive(Debug, Deserialize, Serialize, PartialEq, GmParam)]
#[repr(u32)]
pub enum KillType {
Violent,
Silent,
}
type Lot = u32;
const LOT_NULL: Lot = -1i32 as Lot;
#[derive(Debug, Deserialize, Serialize)]
#[derive(Debug, Deserialize, Serialize, PartialEq, GmParam)]
#[repr(u32)]
pub enum MissionState {
Unavailable = 0,
Available = 1,
Active = 2,
ReadyToComplete = 4,
Completed = 8,
CompleteAndAvailable = 9,
CompleteAndActive = 10,
CompleteAndReadyToComplete = 12,
Fail = 16,
ReadyToCompleteReported = 32,
}
// todo: better modeling with NonNull and Option
type MapId = u16;
const MAP_ID_INVALID: MapId = 0;
type CloneId = u32;
const CLONE_ID_INVALID: CloneId = 0;
#[derive(Debug, Deserialize, Serialize, PartialEq, GmParam)]
pub struct ZoneId {
pub map_id: u16,
pub map_id: MapId,
pub instance_id: u16,
pub clone_id: u32,
pub clone_id: CloneId,
}
impl ZoneId {
const INVALID: Self = Self { map_id: 0, instance_id: 0, clone_id: 0 };
}
#[derive(Debug, Deserialize, Serialize, PartialEq, GmParam)]
@@ -65,9 +120,12 @@ macro_rules! impl_gm {
}
}
impl_gm!(u8);
impl_gm!(u16);
impl_gm!(u32);
impl_gm!(u64);
impl_gm!(i32);
impl_gm!(i64);
impl_gm!(f32);
impl_gm!(GmString);
impl_gm!(GmWString);
+9 -57
View File
@@ -5,7 +5,8 @@ use lu_packets_derive::{GameMessage, GmParam};
use crate::common::{ObjId, OBJID_EMPTY};
use super::super::{GmString, GmWString, Lot, LOT_NULL, Quaternion, Vector3};
use super::super::{GmString, GmWString, KillType, MissionState, Lot, LOT_NULL, Quaternion, Vector3};
use super::super::gm::{EquipInventory, UnEquipInventory, MoveInventoryBatch};
#[derive(Debug, Deserialize, Serialize)]
pub struct SubjectGameMessage {
@@ -144,13 +145,6 @@ pub struct RequestDie {
pub loot_owner_id: ObjId,
}
#[derive(Debug, Deserialize, Serialize, PartialEq, GmParam)]
#[repr(u32)]
pub enum KillType {
Violent,
Silent,
}
#[derive(Debug, GameMessage)]
pub struct PlayEmote {
pub emote_id: i32,
@@ -162,7 +156,7 @@ pub struct CasterDead {
#[default(OBJID_EMPTY)]
pub caster: ObjId,
#[default(0)]
pub ui_skill_handle: u32,
pub skill_handle: u32,
}
#[derive(Debug, GameMessage)]
@@ -171,7 +165,7 @@ pub struct VerifyAck {
pub different: bool,
pub bitstream: Vec<u8>,
#[default(0)]
pub ui_handle: u32,
pub handle: u32,
}
#[derive(Debug, GameMessage)]
@@ -205,32 +199,12 @@ const INVENTORY_INVALID: i32 = -1;
pub struct MoveItemInInventory {
#[default(INVENTORY_INVALID)]
pub dest_inv_type: i32,
pub i_obj_id: ObjId,
pub obj_id: ObjId,
pub inventory_type: i32,
pub response_code: i32,
pub slot: i32,
}
#[derive(Debug, GameMessage)]
pub struct EquipInventory {
#[default(false)]
pub ignore_cooldown: bool,
pub out_success: bool,
pub item_to_equip: ObjId,
}
#[derive(Debug, GameMessage)]
pub struct UnEquipInventory {
#[default(false)]
pub even_if_dead: bool,
#[default(false)]
pub ignore_cooldown: bool,
pub out_success: bool,
pub item_to_unequip: ObjId,
#[default(OBJID_EMPTY)]
pub replacement_object_id: ObjId,
}
#[derive(Debug, GameMessage)]
pub struct RespondToMission {
pub mission_id: i32,
@@ -350,7 +324,7 @@ pub struct RequestLinkedMission {
#[derive(Debug, GameMessage)]
pub struct MissionDialogueOk {
pub is_complete: bool,
pub mission_state: i32,
pub mission_state: MissionState,
pub mission_id: i32,
pub responder: ObjId,
}
@@ -609,28 +583,6 @@ pub struct BounceNotification {
pub success: bool,
}
#[derive(Debug, GameMessage)]
pub struct MoveInventoryBatch {
#[default(false)]
pub allow_partial: bool,
#[default(false)]
pub out_success: bool,
#[default(1)]
pub count: u32,
#[default(0)]
pub dst_bag: i32,
#[default(LOT_NULL)]
pub move_lot: Lot,
#[default(OBJID_EMPTY)]
pub move_subkey: ObjId,
#[default(false)]
pub show_flying_loot: bool,
#[default(0)]
pub src_bag: i32,
#[default(OBJID_EMPTY)]
pub start_object_id: ObjId,
}
#[derive(Debug, GameMessage)]
pub struct SetBbbAutosave {
pub lxfml_data_compressed: Vec<u8>,
@@ -741,7 +693,7 @@ pub struct MoveItemBetweenInventoryTypes {
#[derive(Debug, GameMessage)]
pub struct MissionDialogueCancelled {
pub is_complete: bool,
pub mission_state: i32,
pub mission_state: MissionState,
pub mission_id: i32,
pub responder: ObjId,
}
@@ -751,8 +703,8 @@ pub struct SyncSkill {
#[default(false)]
pub done: bool,
pub bitstream: Vec<u8>,
pub ui_behavior_handle: u32,
pub ui_skill_handle: u32,
pub behavior_handle: u32,
pub skill_handle: u32,
}
#[derive(Debug, GameMessage)]