Some little mod

This commit is contained in:
SouNourS 2017-04-11 14:03:56 +02:00
parent 63b89e4c98
commit eaf61d3c3a
8 changed files with 88 additions and 62 deletions

View file

@ -36,24 +36,24 @@ import scodec.codecs._
* The exact range of unique and valid icon values for this parameter is currently unknown. * The exact range of unique and valid icon values for this parameter is currently unknown.
* It is also unknown what the two bytes preceding `method` specify, as changing them does nothing to the displayed message. * It is also unknown what the two bytes preceding `method` specify, as changing them does nothing to the displayed message.
* @param killer the name of the player who did the killing * @param killer the name of the player who did the killing
* @param killer_unk See above * @param killer_charId Same as CharacterInfoMessage
* @param killer_empire the empire affiliation of the killer * @param killer_empire the empire affiliation of the killer
* @param killer_inVehicle true, if the killer was in a vehicle at the time of the kill; false, otherwise * @param killer_inVehicle true, if the killer was in a vehicle at the time of the kill; false, otherwise
* @param unk na; but does not like being set to 0 * @param unk na; but does not like being set to 0
* @param method modifies the icon in the message, related to the way the victim was killed * @param method modifies the icon in the message, related to the way the victim was killed
* @param victim the name of the player who was killed * @param victim the name of the player who was killed
* @param victim_unk See above * @param victim_charId Same as CharacterInfoMessage
* @param victim_empire the empire affiliation of the victim * @param victim_empire the empire affiliation of the victim
* @param victim_inVehicle true, if the victim was in a vehicle when he was killed; false, otherwise * @param victim_inVehicle true, if the victim was in a vehicle when he was killed; false, otherwise
*/ */
final case class DestroyDisplayMessage(killer : String, final case class DestroyDisplayMessage(killer : String,
killer_unk : Long, killer_charId : Long,
killer_empire : PlanetSideEmpire.Value, killer_empire : PlanetSideEmpire.Value,
killer_inVehicle : Boolean, killer_inVehicle : Boolean,
unk : Int, unk : Int,
method : Int, method : Int,
victim : String, victim : String,
victim_unk : Long, victim_charId : Long,
victim_empire : PlanetSideEmpire.Value, victim_empire : PlanetSideEmpire.Value,
victim_inVehicle : Boolean victim_inVehicle : Boolean
) )
@ -66,13 +66,13 @@ final case class DestroyDisplayMessage(killer : String,
object DestroyDisplayMessage extends Marshallable[DestroyDisplayMessage] { object DestroyDisplayMessage extends Marshallable[DestroyDisplayMessage] {
implicit val codec : Codec[DestroyDisplayMessage] = ( implicit val codec : Codec[DestroyDisplayMessage] = (
("killer" | PacketHelpers.encodedWideString) :: ("killer" | PacketHelpers.encodedWideString) ::
("killer_unk" | ulongL(32)) :: ("killer_charId" | ulongL(32)) ::
("killer_empire" | PlanetSideEmpire.codec) :: ("killer_empire" | PlanetSideEmpire.codec) ::
("killer_inVehicle" | bool) :: ("killer_inVehicle" | bool) ::
("unk" | uint16L) :: ("unk" | uint16L) ::
("method" | uint16L) :: ("method" | uint16L) ::
("victim" | PacketHelpers.encodedWideStringAligned(5)) :: ("victim" | PacketHelpers.encodedWideStringAligned(5)) ::
("victim_unk" | ulongL(32)) :: ("victim_charId" | ulongL(32)) ::
("victim_empire" | PlanetSideEmpire.codec) :: ("victim_empire" | PlanetSideEmpire.codec) ::
("victim_inVehicle" | bool) ("victim_inVehicle" | bool)
).as[DestroyDisplayMessage] ).as[DestroyDisplayMessage]

View file

@ -9,7 +9,7 @@ final case class MoveItemMessage(item_guid : PlanetSideGUID,
avatar_guid_1 : PlanetSideGUID, avatar_guid_1 : PlanetSideGUID,
avatar_guid_2 : PlanetSideGUID, avatar_guid_2 : PlanetSideGUID,
dest : Int, dest : Int,
unk1 : Int) unk1 : Int) // TODO ammo quantity ?
extends PlanetSideGamePacket { extends PlanetSideGamePacket {
type Packet = MoveItemMessage type Packet = MoveItemMessage
def opcode = GamePacketOpcode.MoveItemMessage def opcode = GamePacketOpcode.MoveItemMessage

View file

@ -15,32 +15,35 @@ import scodec.codecs._
* @param avatar_guid the player's GUID * @param avatar_guid the player's GUID
* @param pos where the player is in the world * @param pos where the player is in the world
* @param vel how the player is moving * @param vel how the player is moving
* @param unk1 na * @param facingYaw the angle with respect to the horizon towards which the avatar is looking;
* @param aim_pitch the vertical angle of viewing * the model's whole body is facing this direction;
* @param unk2 na * measurements are counter-clockwise from East
* @param facingPitch the angle with respect to the sky and the ground towards which the avatar is looking
* @param facingYawUpper the angle of the avatar's upper body with respect to its forward-facing direction
* @param seq_time na * @param seq_time na
* @param unk1 na
* @param is_crouching avatar is crouching
* @param is_jumping avatar is jumping;
* must remain flagged for jump to maintain animation
* @param jump_thrust provide a measure of vertical stability when really close to the avatar character
* @param is_cloaked avatar is cloaked by virtue of an Infiltration Suit
* @param unk2 na
* @param unk3 na * @param unk3 na
* @param is_crouching whether the player is crouched
* @param is_jumping na
* @param unk4 na
* @param is_cloaking whether the player is cloaked by virtue of an Infiltration Suit
* @param unk5 na
* @param unk6 na
*/ */
final case class PlayerStateMessageUpstream(avatar_guid : PlanetSideGUID, final case class PlayerStateMessageUpstream(avatar_guid : PlanetSideGUID,
pos : Vector3, pos : Vector3,
vel : Option[Vector3], vel : Option[Vector3],
unk1 : Int, facingYaw : Int,
aim_pitch : Int, facingPitch : Int,
unk2 : Int, facingYawUpper : Int,
seq_time : Int, seq_time : Int,
unk3 : Int, unk1 : Int,
is_crouching : Boolean, is_crouching : Boolean,
is_jumping : Boolean, is_jumping : Boolean,
unk4 : Boolean, jump_thrust : Boolean,
is_cloaking : Boolean, is_cloaked : Boolean,
unk5 : Int, unk2 : Int,
unk6 : Int) unk3 : Int)
extends PlanetSideGamePacket { extends PlanetSideGamePacket {
type Packet = PlayerStateMessageUpstream type Packet = PlayerStateMessageUpstream
def opcode = GamePacketOpcode.PlayerStateMessageUpstream def opcode = GamePacketOpcode.PlayerStateMessageUpstream
@ -49,19 +52,19 @@ final case class PlayerStateMessageUpstream(avatar_guid : PlanetSideGUID,
object PlayerStateMessageUpstream extends Marshallable[PlayerStateMessageUpstream] { object PlayerStateMessageUpstream extends Marshallable[PlayerStateMessageUpstream] {
implicit val codec : Codec[PlayerStateMessageUpstream] = ( implicit val codec : Codec[PlayerStateMessageUpstream] = (
("avatar_guid" | PlanetSideGUID.codec) :: ("avatar_guid" | PlanetSideGUID.codec) ::
("pos" | Vector3.codec_pos) :: ("pos" | Vector3.codec_pos) ::
("vel" | optional(bool, Vector3.codec_vel)) :: ("vel" | optional(bool, Vector3.codec_vel)) ::
("unk1" | uint8L) :: ("facingYaw" | uint8L) ::
("aim_pitch" | uint8L) :: ("facingPitch" | uint8L) ::
("unk2" | uint8L) :: ("facingYawUpper" | uint8L) ::
("seq_time" | uintL(10)) :: ("seq_time" | uintL(10)) ::
("unk3" | uintL(3)) :: ("unk1" | uintL(3)) ::
("is_crouching" | bool) :: ("is_crouching" | bool) ::
("is_jumping" | bool) :: ("is_jumping" | bool) ::
("unk4" | bool) :: ("jump_thrust" | bool) ::
("is_cloaking" | bool) :: ("is_cloaked" | bool) ::
("unk5" | uint8L) :: ("unk2" | uint8L) ::
("unk6" | uint16L) ("unk3" | uint16L)
).as[PlayerStateMessageUpstream] ).as[PlayerStateMessageUpstream]
} }

View file

@ -6,6 +6,20 @@ import net.psforever.types.Vector3
import scodec.Codec import scodec.Codec
import scodec.codecs._ import scodec.codecs._
/**
* (Where the child object was before it was moved is not specified or important.)<br>
* @param avatar_guid the player.
* @param unk1 dont know how call that. It's the "item" ID when use a rek to hack or a medkit to heal.
* @param object_guid can be : Door, Terminal, Avatar (medkit).
* @param unk2 ???
* @param unk3 ??? true when use a rek (false when door, medkit or open equip term)
* @param unk4 ???
* @param unk5 ???
* @param unk6 ???
* @param unk7 ??? 25 when door 223 when terminal
* @param unk8 ??? 0 when door 1 when use rek (252 then equipment term)
* @param itemType object ID from game_objects.adb (ex 612 is an equipment terminal, for medkit we have 121 (avatar))
*/
final case class UseItemMessage(avatar_guid : PlanetSideGUID, final case class UseItemMessage(avatar_guid : PlanetSideGUID,
unk1 : Int, unk1 : Int,
object_guid : PlanetSideGUID, object_guid : PlanetSideGUID,
@ -16,7 +30,7 @@ final case class UseItemMessage(avatar_guid : PlanetSideGUID,
unk6 : Int, unk6 : Int,
unk7 : Int, unk7 : Int,
unk8 : Int, unk8 : Int,
unk9 : Long) itemType : Long)
extends PlanetSideGamePacket { extends PlanetSideGamePacket {
type Packet = UseItemMessage type Packet = UseItemMessage
def opcode = GamePacketOpcode.UseItemMessage def opcode = GamePacketOpcode.UseItemMessage
@ -35,6 +49,6 @@ object UseItemMessage extends Marshallable[UseItemMessage] {
("unk6" | uint8L) :: ("unk6" | uint8L) ::
("unk7" | uint8L) :: ("unk7" | uint8L) ::
("unk8" | uint8L) :: ("unk8" | uint8L) ::
("unk9" | uint32L) ("itemType" | uint32L)
).as[UseItemMessage] ).as[UseItemMessage]
} }

View file

@ -12,15 +12,15 @@ class DestroyDisplayMessageTest extends Specification {
"decode" in { "decode" in {
PacketCoding.DecodePacket(string).require match { PacketCoding.DecodePacket(string).require match {
case DestroyDisplayMessage(killer, killer_unk, killer_empire, killer_inVehicle, unk, method, victim, victim_unk, victim_empire, victim_inVehicle) => case DestroyDisplayMessage(killer, killer_charId, killer_empire, killer_inVehicle, unk, method, victim, victim_charId, victim_empire, victim_inVehicle) =>
killer mustEqual "Angello" killer mustEqual "Angello"
killer_unk mustEqual 30981173 killer_charId mustEqual 30981173
killer_empire mustEqual PlanetSideEmpire.VS killer_empire mustEqual PlanetSideEmpire.VS
killer_inVehicle mustEqual false killer_inVehicle mustEqual false
unk mustEqual 121 unk mustEqual 121
method mustEqual 969 method mustEqual 969
victim mustEqual "HMFIC" victim mustEqual "HMFIC"
victim_unk mustEqual 31035057 victim_charId mustEqual 31035057
victim_empire mustEqual PlanetSideEmpire.TR victim_empire mustEqual PlanetSideEmpire.TR
victim_inVehicle mustEqual false victim_inVehicle mustEqual false
case _ => case _ =>

View file

@ -12,21 +12,21 @@ class PlayerStateMessageUpstreamTest extends Specification {
"decode" in { "decode" in {
PacketCoding.DecodePacket(string).require match { PacketCoding.DecodePacket(string).require match {
case PlayerStateMessageUpstream(avatar_guid, pos, vel, unk1, aim_pitch, unk2, seq_time, unk3, is_crouching, unk4, unk5, is_cloaking, unk6, unk7) => case PlayerStateMessageUpstream(avatar_guid, pos, vel, facingYaw, facingPitch, facingYawUpper, seq_time, unk1, is_crouching, is_jumping, jump_thrust, is_cloaked, unk2, unk3) =>
avatar_guid mustEqual PlanetSideGUID(75) avatar_guid mustEqual PlanetSideGUID(75)
pos mustEqual Vector3(3694.1094f, 2735.4531f, 90.84375f) pos mustEqual Vector3(3694.1094f, 2735.4531f, 90.84375f)
vel mustEqual Some(Vector3(4.375f, 2.59375f, 0.0f)) vel mustEqual Some(Vector3(4.375f, 2.59375f, 0.0f))
unk1 mustEqual 10 facingYaw mustEqual 10
aim_pitch mustEqual 3 facingPitch mustEqual 3
unk2 mustEqual 0 facingYawUpper mustEqual 0
seq_time mustEqual 136 seq_time mustEqual 136
unk3 mustEqual 0 unk1 mustEqual 0
is_crouching mustEqual false is_crouching mustEqual false
unk4 mustEqual false is_jumping mustEqual false
unk5 mustEqual false jump_thrust mustEqual false
is_cloaking mustEqual false is_cloaked mustEqual false
unk6 mustEqual 112 unk2 mustEqual 112
unk7 mustEqual 0 unk3 mustEqual 0
case _ => case _ =>
ko ko
} }

View file

@ -12,7 +12,7 @@ class UseItemMessageTest extends Specification {
"decode" in { "decode" in {
PacketCoding.DecodePacket(string).require match { PacketCoding.DecodePacket(string).require match {
case UseItemMessage(avatar_guid, unk1, object_guid, unk2, unk3, unk4, unk5, unk6, unk7, unk8, unk9) => case UseItemMessage(avatar_guid, unk1, object_guid, unk2, unk3, unk4, unk5, unk6, unk7, unk8, itemType) =>
avatar_guid mustEqual PlanetSideGUID(75) avatar_guid mustEqual PlanetSideGUID(75)
unk1 mustEqual 0 unk1 mustEqual 0
object_guid mustEqual PlanetSideGUID(372) object_guid mustEqual PlanetSideGUID(372)
@ -23,7 +23,7 @@ class UseItemMessageTest extends Specification {
unk6 mustEqual 11 unk6 mustEqual 11
unk7 mustEqual 25 unk7 mustEqual 25
unk8 mustEqual 0 unk8 mustEqual 0
unk9 mustEqual 364 itemType mustEqual 364
case _ => case _ =>
ko ko
} }

View file

@ -279,12 +279,14 @@ class WorldSessionActor extends Actor with MDCContextAware {
sendResponse(PacketCoding.CreateGamePacket(0, EmoteMsg(avatar_guid, emote))) sendResponse(PacketCoding.CreateGamePacket(0, EmoteMsg(avatar_guid, emote)))
case msg @ DropItemMessage(item_guid) => case msg @ DropItemMessage(item_guid) =>
log.info("DropItem: " + msg)
//item dropped where you spawn in VS Sanctuary //item dropped where you spawn in VS Sanctuary
sendResponse(PacketCoding.CreateGamePacket(0, ObjectDetachMessage(PlanetSideGUID(75), item_guid, app.pos, 0, 0, 0))) sendResponse(PacketCoding.CreateGamePacket(0, ObjectDetachMessage(PlanetSideGUID(75), item_guid, app.pos, 0, 0, 0)))
log.info("DropItem: " + msg)
case msg @ PickupItemMessage(item_guid, player_guid, unk1, unk2) => case msg @ PickupItemMessage(item_guid, player_guid, unk1, unk2) =>
log.info("PickupItem: " + msg) log.info("PickupItem: " + msg)
sendResponse(PacketCoding.CreateGamePacket(0, PickupItemMessage(item_guid, player_guid, unk1, unk2)))
sendResponse(PacketCoding.CreateGamePacket(0, ObjectAttachMessage(player_guid, item_guid, 250))) // item on mouse
case msg @ ReloadMessage(item_guid, ammo_clip, unk1) => case msg @ ReloadMessage(item_guid, ammo_clip, unk1) =>
log.info("Reload: " + msg) log.info("Reload: " + msg)
@ -298,15 +300,20 @@ class WorldSessionActor extends Actor with MDCContextAware {
case msg @ ZipLineMessage(player_guid,origin_side,action,id,pos) => case msg @ ZipLineMessage(player_guid,origin_side,action,id,pos) =>
log.info("ZipLineMessage: " + msg) log.info("ZipLineMessage: " + msg)
if(action == 0) { if (!origin_side && action == 0) {
//doing this lets you use the zip line, but you can't get off //doing this lets you use the zip line in one direction, cant come back
//sendResponse(PacketCoding.CreateGamePacket(0,ZipLineMessage(player_guid, origin_side, action, id, pos))) sendResponse(PacketCoding.CreateGamePacket(0, ZipLineMessage(player_guid, origin_side, action, id, pos)))
} }
else if(action == 1) { else if (!origin_side && action == 1) {
//disembark from zipline at destination? //disembark from zipline at destination !
sendResponse(PacketCoding.CreateGamePacket(0, ZipLineMessage(player_guid, origin_side, action, 0, pos)))
} }
else if(action == 2) { else if (!origin_side && action == 2) {
//get off by force //get off by force
sendResponse(PacketCoding.CreateGamePacket(0, ZipLineMessage(player_guid, origin_side, action, 0, pos)))
}
else if (origin_side && action == 0) {
// for teleporters & the other zipline direction
} }
case msg @ RequestDestroyMessage(object_guid) => case msg @ RequestDestroyMessage(object_guid) =>
@ -325,15 +332,17 @@ class WorldSessionActor extends Actor with MDCContextAware {
case msg @ ChangeAmmoMessage(item_guid, unk1) => case msg @ ChangeAmmoMessage(item_guid, unk1) =>
log.info("ChangeAmmo: " + msg) log.info("ChangeAmmo: " + msg)
case msg @ UseItemMessage(avatar_guid, unk1, object_guid, unk2, unk3, unk4, unk5, unk6, unk7, unk8, unk9) => case msg @ UseItemMessage(avatar_guid, unk1, object_guid, unk2, unk3, unk4, unk5, unk6, unk7, unk8, itemType) =>
log.info("UseItem: " + msg) log.info("UseItem: " + msg)
// TODO: Not all fields in the response are identical to source in real packet logs (but seems to be ok) // TODO: Not all fields in the response are identical to source in real packet logs (but seems to be ok)
// TODO: Not all incoming UseItemMessage's respond with another UseItemMessage (i.e. doors only send out GenericObjectStateMsg) // TODO: Not all incoming UseItemMessage's respond with another UseItemMessage (i.e. doors only send out GenericObjectStateMsg)
sendResponse(PacketCoding.CreateGamePacket(0, UseItemMessage(avatar_guid, unk1, object_guid, unk2, unk3, unk4, unk5, unk6, unk7, unk8, unk9))) if (itemType != 121) sendResponse(PacketCoding.CreateGamePacket(0, UseItemMessage(avatar_guid, unk1, object_guid, unk2, unk3, unk4, unk5, unk6, unk7, unk8, itemType)))
if(unk1 != 0){ // TODO : medkit use ?! if (itemType == 121 && !unk3){ // TODO : medkit use ?!
sendResponse(PacketCoding.CreateGamePacket(0, GenericObjectStateMsg(object_guid, 16))) sendResponse(PacketCoding.CreateGamePacket(0, UseItemMessage(avatar_guid, unk1, object_guid, 0, unk3, unk4, unk5, unk6, unk7, unk8, itemType)))
sendResponse(PacketCoding.CreateGamePacket(0, PlanetsideAttributeMessage(avatar_guid, 0, 100))) // avatar with 100 hp
sendResponse(PacketCoding.CreateGamePacket(0, ObjectDeleteMessage(PlanetSideGUID(unk1), 2))) sendResponse(PacketCoding.CreateGamePacket(0, ObjectDeleteMessage(PlanetSideGUID(unk1), 2)))
} else { }
if (unk1 == 0 && !unk3 && unk7 == 25) {
// TODO: This should only actually be sent to doors upon opening; may break non-door items upon use // TODO: This should only actually be sent to doors upon opening; may break non-door items upon use
sendResponse(PacketCoding.CreateGamePacket(0, GenericObjectStateMsg(object_guid, 16))) sendResponse(PacketCoding.CreateGamePacket(0, GenericObjectStateMsg(object_guid, 16)))
} }