mirror of
https://github.com/2revoemag/PSF-BotServer.git
synced 2026-07-15 16:34:39 +00:00
Advanced medical + other bits (#287)
* Allow medical applicator to revive players * Allow dead players to be repaired * Refactoring medapp + bank usage * Make bank + medapp use charges from magazine * Don't try to heal/repair other players with MaxHealth/MaxArmor <= 0 * Ignore tool use on SpawnTube objects (for example; don't deconstruct from using a medical applicator on a spawn tube)
This commit is contained in:
parent
53d677dc5d
commit
aec9c15bdd
6 changed files with 92 additions and 86 deletions
|
|
@ -99,6 +99,11 @@ class Player(private val core : Avatar) extends PlanetSideGameObject
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
def Revive : Boolean = {
|
||||||
|
alive = true
|
||||||
|
true
|
||||||
|
}
|
||||||
|
|
||||||
def Release : Boolean = {
|
def Release : Boolean = {
|
||||||
if(!isAlive) {
|
if(!isAlive) {
|
||||||
backpack = true
|
backpack = true
|
||||||
|
|
@ -112,7 +117,7 @@ class Player(private val core : Avatar) extends PlanetSideGameObject
|
||||||
def Health : Int = health
|
def Health : Int = health
|
||||||
|
|
||||||
def Health_=(assignHealth : Int) : Int = {
|
def Health_=(assignHealth : Int) : Int = {
|
||||||
health = if(isAlive) { math.min(math.max(0, assignHealth), MaxHealth) } else { 0 }
|
health = math.min(math.max(0, assignHealth), MaxHealth)
|
||||||
Health
|
Health
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -140,7 +145,7 @@ class Player(private val core : Avatar) extends PlanetSideGameObject
|
||||||
def Armor : Int = armor
|
def Armor : Int = armor
|
||||||
|
|
||||||
def Armor_=(assignArmor : Int) : Int = {
|
def Armor_=(assignArmor : Int) : Int = {
|
||||||
armor = if(isAlive) { math.min(math.max(0, assignArmor), MaxArmor) } else { 0 }
|
armor = math.min(math.max(0, assignArmor), MaxArmor)
|
||||||
Armor
|
Armor
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -92,7 +92,7 @@ object AvatarDeadStateMessage extends Marshallable[AvatarDeadStateMessage] {
|
||||||
("timer_max" | uint32L) ::
|
("timer_max" | uint32L) ::
|
||||||
("timer" | uint32L) ::
|
("timer" | uint32L) ::
|
||||||
("pos" | Vector3.codec_pos) ::
|
("pos" | Vector3.codec_pos) ::
|
||||||
("unk4" | factionLongCodec) ::
|
("faction" | factionLongCodec) ::
|
||||||
("unk5" | bool)
|
("unk5" | bool)
|
||||||
).as[AvatarDeadStateMessage]
|
).as[AvatarDeadStateMessage]
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -139,6 +139,10 @@ class AvatarService extends Actor {
|
||||||
AvatarEvents.publish(
|
AvatarEvents.publish(
|
||||||
AvatarServiceResponse(s"/$forChannel/Avatar", guid, AvatarResponse.PlanetsideAttribute(attribute_type, attribute_value))
|
AvatarServiceResponse(s"/$forChannel/Avatar", guid, AvatarResponse.PlanetsideAttribute(attribute_type, attribute_value))
|
||||||
)
|
)
|
||||||
|
case AvatarAction.PlanetsideAttributeToAll(guid, attribute_type, attribute_value) =>
|
||||||
|
AvatarEvents.publish(
|
||||||
|
AvatarServiceResponse(s"/$forChannel/Avatar", guid, AvatarResponse.PlanetsideAttributeToAll(attribute_type, attribute_value))
|
||||||
|
)
|
||||||
case AvatarAction.PlanetsideAttributeSelf(guid, attribute_type, attribute_value) =>
|
case AvatarAction.PlanetsideAttributeSelf(guid, attribute_type, attribute_value) =>
|
||||||
AvatarEvents.publish(
|
AvatarEvents.publish(
|
||||||
AvatarServiceResponse(s"/$forChannel/Avatar", guid, AvatarResponse.PlanetsideAttributeSelf(attribute_type, attribute_value))
|
AvatarServiceResponse(s"/$forChannel/Avatar", guid, AvatarResponse.PlanetsideAttributeSelf(attribute_type, attribute_value))
|
||||||
|
|
@ -192,6 +196,14 @@ class AvatarService extends Actor {
|
||||||
AvatarEvents.publish(
|
AvatarEvents.publish(
|
||||||
AvatarServiceResponse(s"/$forChannel/Avatar", player_guid, AvatarResponse.SendResponse(msg))
|
AvatarServiceResponse(s"/$forChannel/Avatar", player_guid, AvatarResponse.SendResponse(msg))
|
||||||
)
|
)
|
||||||
|
case AvatarAction.SendResponseTargeted(target_guid, msg) =>
|
||||||
|
AvatarEvents.publish(
|
||||||
|
AvatarServiceResponse(s"/$forChannel/Avatar", target_guid, AvatarResponse.SendResponseTargeted(target_guid, msg))
|
||||||
|
)
|
||||||
|
case AvatarAction.Revive(target_guid) =>
|
||||||
|
AvatarEvents.publish(
|
||||||
|
AvatarServiceResponse(s"/$forChannel/Avatar", target_guid, AvatarResponse.Revive(target_guid))
|
||||||
|
)
|
||||||
|
|
||||||
case _ => ;
|
case _ => ;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -43,17 +43,20 @@ object AvatarAction {
|
||||||
final case class ObjectDelete(player_guid : PlanetSideGUID, item_guid : PlanetSideGUID, unk : Int = 0) extends Action
|
final case class ObjectDelete(player_guid : PlanetSideGUID, item_guid : PlanetSideGUID, unk : Int = 0) extends Action
|
||||||
final case class ObjectHeld(player_guid : PlanetSideGUID, slot : Int) extends Action
|
final case class ObjectHeld(player_guid : PlanetSideGUID, slot : Int) extends Action
|
||||||
final case class PlanetsideAttribute(player_guid : PlanetSideGUID, attribute_type : Int, attribute_value : Long) extends Action
|
final case class PlanetsideAttribute(player_guid : PlanetSideGUID, attribute_type : Int, attribute_value : Long) extends Action
|
||||||
|
final case class PlanetsideAttributeToAll(player_guid : PlanetSideGUID, attribute_type : Int, attribute_value : Long) extends Action
|
||||||
final case class PlanetsideAttributeSelf(player_guid : PlanetSideGUID, attribute_type : Int, attribute_value : Long) extends Action
|
final case class PlanetsideAttributeSelf(player_guid : PlanetSideGUID, attribute_type : Int, attribute_value : Long) extends Action
|
||||||
final case class PlayerState(player_guid : PlanetSideGUID, pos : Vector3, vel : Option[Vector3], facingYaw : Float, facingPitch : Float, facingYawUpper : Float, timestamp : Int, is_crouching : Boolean, is_jumping : Boolean, jump_thrust : Boolean, is_cloaked : Boolean, spectator : Boolean, weaponInHand : Boolean) extends Action
|
final case class PlayerState(player_guid : PlanetSideGUID, pos : Vector3, vel : Option[Vector3], facingYaw : Float, facingPitch : Float, facingYawUpper : Float, timestamp : Int, is_crouching : Boolean, is_jumping : Boolean, jump_thrust : Boolean, is_cloaked : Boolean, spectator : Boolean, weaponInHand : Boolean) extends Action
|
||||||
final case class PickupItem(player_guid : PlanetSideGUID, zone : Zone, target : PlanetSideGameObject with Container, slot : Int, item : Equipment, unk : Int = 0) extends Action
|
final case class PickupItem(player_guid : PlanetSideGUID, zone : Zone, target : PlanetSideGameObject with Container, slot : Int, item : Equipment, unk : Int = 0) extends Action
|
||||||
final case class PutDownFDU(player_guid : PlanetSideGUID) extends Action
|
final case class PutDownFDU(player_guid : PlanetSideGUID) extends Action
|
||||||
final case class Release(player : Player, zone : Zone, time : Option[FiniteDuration] = None) extends Action
|
final case class Release(player : Player, zone : Zone, time : Option[FiniteDuration] = None) extends Action
|
||||||
|
final case class Revive(target_guid: PlanetSideGUID) extends Action
|
||||||
final case class Reload(player_guid : PlanetSideGUID, weapon_guid : PlanetSideGUID) extends Action
|
final case class Reload(player_guid : PlanetSideGUID, weapon_guid : PlanetSideGUID) extends Action
|
||||||
final case class SetEmpire(player_guid : PlanetSideGUID, object_guid : PlanetSideGUID, faction : PlanetSideEmpire.Value) extends Action
|
final case class SetEmpire(player_guid : PlanetSideGUID, object_guid : PlanetSideGUID, faction : PlanetSideEmpire.Value) extends Action
|
||||||
final case class StowEquipment(player_guid : PlanetSideGUID, target_guid : PlanetSideGUID, slot : Int, item : Equipment) extends Action
|
final case class StowEquipment(player_guid : PlanetSideGUID, target_guid : PlanetSideGUID, slot : Int, item : Equipment) extends Action
|
||||||
final case class WeaponDryFire(player_guid : PlanetSideGUID, weapon_guid : PlanetSideGUID) extends Action
|
final case class WeaponDryFire(player_guid : PlanetSideGUID, weapon_guid : PlanetSideGUID) extends Action
|
||||||
|
|
||||||
final case class SendResponse(player_guid: PlanetSideGUID, msg: PlanetSideGamePacket) extends Action
|
final case class SendResponse(player_guid: PlanetSideGUID, msg: PlanetSideGamePacket) extends Action
|
||||||
|
final case class SendResponseTargeted(target_guid: PlanetSideGUID, msg: PlanetSideGamePacket) extends Action
|
||||||
|
|
||||||
// final case class PlayerStateShift(killer : PlanetSideGUID, victim : PlanetSideGUID) extends Action
|
// final case class PlayerStateShift(killer : PlanetSideGUID, victim : PlanetSideGUID) extends Action
|
||||||
// final case class DestroyDisplay(killer : PlanetSideGUID, victim : PlanetSideGUID) extends Action
|
// final case class DestroyDisplay(killer : PlanetSideGUID, victim : PlanetSideGUID) extends Action
|
||||||
|
|
|
||||||
|
|
@ -36,15 +36,18 @@ object AvatarResponse {
|
||||||
final case class ObjectDelete(item_guid : PlanetSideGUID, unk : Int) extends Response
|
final case class ObjectDelete(item_guid : PlanetSideGUID, unk : Int) extends Response
|
||||||
final case class ObjectHeld(slot : Int) extends Response
|
final case class ObjectHeld(slot : Int) extends Response
|
||||||
final case class PlanetsideAttribute(attribute_type : Int, attribute_value : Long) extends Response
|
final case class PlanetsideAttribute(attribute_type : Int, attribute_value : Long) extends Response
|
||||||
|
final case class PlanetsideAttributeToAll(attribute_type : Int, attribute_value : Long) extends Response
|
||||||
final case class PlanetsideAttributeSelf(attribute_type : Int, attribute_value : Long) extends Response
|
final case class PlanetsideAttributeSelf(attribute_type : Int, attribute_value : Long) extends Response
|
||||||
final case class PlayerState(pos : Vector3, vel : Option[Vector3], facingYaw : Float, facingPitch : Float, facingYawUpper : Float, timestamp : Int, is_crouching : Boolean, is_jumping : Boolean, jump_thrust : Boolean, is_cloaked : Boolean, spectator : Boolean, weaponInHand : Boolean) extends Response
|
final case class PlayerState(pos : Vector3, vel : Option[Vector3], facingYaw : Float, facingPitch : Float, facingYawUpper : Float, timestamp : Int, is_crouching : Boolean, is_jumping : Boolean, jump_thrust : Boolean, is_cloaked : Boolean, spectator : Boolean, weaponInHand : Boolean) extends Response
|
||||||
final case class PutDownFDU(target_guid : PlanetSideGUID) extends Response
|
final case class PutDownFDU(target_guid : PlanetSideGUID) extends Response
|
||||||
final case class Release(player : Player) extends Response
|
final case class Release(player : Player) extends Response
|
||||||
final case class Reload(weapon_guid : PlanetSideGUID) extends Response
|
final case class Reload(weapon_guid : PlanetSideGUID) extends Response
|
||||||
|
final case class Revive(target_guid: PlanetSideGUID) extends Response
|
||||||
final case class SetEmpire(object_guid : PlanetSideGUID, faction : PlanetSideEmpire.Value) extends Response
|
final case class SetEmpire(object_guid : PlanetSideGUID, faction : PlanetSideEmpire.Value) extends Response
|
||||||
final case class StowEquipment(target_guid : PlanetSideGUID, slot : Int, item : Equipment) extends Response
|
final case class StowEquipment(target_guid : PlanetSideGUID, slot : Int, item : Equipment) extends Response
|
||||||
final case class WeaponDryFire(weapon_guid : PlanetSideGUID) extends Response
|
final case class WeaponDryFire(weapon_guid : PlanetSideGUID) extends Response
|
||||||
|
|
||||||
final case class SendResponse(msg: PlanetSideGamePacket) extends Response
|
final case class SendResponse(msg: PlanetSideGamePacket) extends Response
|
||||||
|
final case class SendResponseTargeted(target_guid : PlanetSideGUID, msg: PlanetSideGamePacket) extends Response
|
||||||
// final case class PlayerStateShift(itemID : PlanetSideGUID) extends Response
|
// final case class PlayerStateShift(itemID : PlanetSideGUID) extends Response
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -1234,6 +1234,18 @@ class WorldSessionActor extends Actor with MDCContextAware {
|
||||||
case AvatarResponse.SendResponse(msg) =>
|
case AvatarResponse.SendResponse(msg) =>
|
||||||
sendResponse(msg)
|
sendResponse(msg)
|
||||||
|
|
||||||
|
case AvatarResponse.SendResponseTargeted(target_guid, msg) =>
|
||||||
|
if(tplayer_guid == target_guid) {
|
||||||
|
sendResponse(msg)
|
||||||
|
}
|
||||||
|
|
||||||
|
case AvatarResponse.Revive(target_guid) =>
|
||||||
|
if(tplayer_guid == target_guid) {
|
||||||
|
deadState = DeadState.Alive
|
||||||
|
reviveTimer.cancel
|
||||||
|
sendResponse(AvatarDeadStateMessage(DeadState.Alive, 0, 0, player.Position, player.Faction, true))
|
||||||
|
}
|
||||||
|
|
||||||
case AvatarResponse.ArmorChanged(suit, subtype) =>
|
case AvatarResponse.ArmorChanged(suit, subtype) =>
|
||||||
if(tplayer_guid != guid) {
|
if(tplayer_guid != guid) {
|
||||||
sendResponse(ArmorChangedMessage(guid, suit, subtype))
|
sendResponse(ArmorChangedMessage(guid, suit, subtype))
|
||||||
|
|
@ -1405,6 +1417,9 @@ class WorldSessionActor extends Actor with MDCContextAware {
|
||||||
sendResponse(PlanetsideAttributeMessage(guid, attribute_type, attribute_value))
|
sendResponse(PlanetsideAttributeMessage(guid, attribute_type, attribute_value))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case AvatarResponse.PlanetsideAttributeToAll(attribute_type, attribute_value) =>
|
||||||
|
sendResponse(PlanetsideAttributeMessage(guid, attribute_type, attribute_value))
|
||||||
|
|
||||||
case AvatarResponse.PlanetsideAttributeSelf(attribute_type, attribute_value) =>
|
case AvatarResponse.PlanetsideAttributeSelf(attribute_type, attribute_value) =>
|
||||||
if (tplayer_guid == guid) {
|
if (tplayer_guid == guid) {
|
||||||
sendResponse(PlanetsideAttributeMessage(guid, attribute_type, attribute_value))
|
sendResponse(PlanetsideAttributeMessage(guid, attribute_type, attribute_value))
|
||||||
|
|
@ -4853,89 +4868,54 @@ class WorldSessionActor extends Actor with MDCContextAware {
|
||||||
log.warn(s"UseItem: anticipated a Kit $item_used_guid, but can't find it")
|
log.warn(s"UseItem: anticipated a Kit $item_used_guid, but can't find it")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (itemType == 121 && unk3) {
|
else if (itemType == ObjectClass.avatar && unk3) {
|
||||||
FindWeapon match {
|
FindWeapon match {
|
||||||
case Some(tool: Tool) =>
|
case Some(tool: Tool) =>
|
||||||
if (tool.Definition.ObjectId == 132) {
|
if (tool.Definition == GlobalDefinitions.bank) {
|
||||||
// TODO : bank ?
|
|
||||||
continent.GUID(object_guid) match {
|
continent.GUID(object_guid) match {
|
||||||
case Some(tplayer: Player) =>
|
case Some(tplayer: Player) =>
|
||||||
if (player.GUID != tplayer.GUID && Vector3.Distance(player.Position, tplayer.Position) < 5 && player.Faction == tplayer.Faction && player.Velocity.isEmpty) {
|
if (player.GUID != tplayer.GUID && Vector3.Distance(player.Position, tplayer.Position) < 5 && player.Faction == tplayer.Faction && player.Velocity.isEmpty && tplayer.MaxArmor > 0) {
|
||||||
if (tplayer.MaxArmor - tplayer.Armor <= 15) {
|
tplayer.Armor += 15
|
||||||
tplayer.Armor = tplayer.MaxArmor
|
tool.Discharge
|
||||||
// sendResponse(QuantityUpdateMessage(PlanetSideGUID(8214),ammo_quantity_left))
|
sendResponse(InventoryStateMessage(tool.AmmoSlot.Box.GUID, obj.GUID, tool.Magazine))
|
||||||
val RepairPercent: Int = tplayer.Armor * 100 / tplayer.MaxArmor
|
val RepairPercent: Int = tplayer.Armor * 100 / tplayer.MaxArmor
|
||||||
sendResponse(RepairMessage(object_guid, RepairPercent))
|
sendResponse(RepairMessage(object_guid, RepairPercent))
|
||||||
avatarService ! AvatarServiceMessage(tplayer.Continent, AvatarAction.PlanetsideAttributeSelf(tplayer.GUID, 4, tplayer.Armor))
|
|
||||||
avatarService ! AvatarServiceMessage(tplayer.Continent, AvatarAction.PlanetsideAttribute(tplayer.GUID, 4, tplayer.Armor))
|
|
||||||
}
|
|
||||||
if (tplayer.MaxArmor - tplayer.Armor > 15) {
|
|
||||||
tplayer.Armor += 15
|
|
||||||
// sendResponse(QuantityUpdateMessage(PlanetSideGUID(8214),ammo_quantity_left))
|
|
||||||
val RepairPercent: Int = tplayer.Armor * 100 / tplayer.MaxArmor
|
|
||||||
sendResponse(RepairMessage(object_guid, RepairPercent))
|
|
||||||
avatarService ! AvatarServiceMessage(tplayer.Continent, AvatarAction.PlanetsideAttributeSelf(tplayer.GUID, 4, tplayer.Armor))
|
|
||||||
avatarService ! AvatarServiceMessage(tplayer.Continent, AvatarAction.PlanetsideAttribute(tplayer.GUID, 4, tplayer.Armor))
|
|
||||||
}
|
|
||||||
} else if (player.GUID == object_guid && player.Velocity.isEmpty) {
|
|
||||||
if (player.MaxArmor - player.Armor <= 15) {
|
|
||||||
player.Armor = player.MaxArmor
|
|
||||||
// sendResponse(QuantityUpdateMessage(PlanetSideGUID(8214),ammo_quantity_left))
|
|
||||||
// sendResponse(RepairMessage(object_guid, player.Armor)) // Todo is that needed ?
|
|
||||||
sendResponse(PlanetsideAttributeMessage(player.GUID, 4, player.Armor))
|
|
||||||
avatarService ! AvatarServiceMessage(player.Continent, AvatarAction.PlanetsideAttribute(player.GUID, 4, player.Armor))
|
|
||||||
}
|
|
||||||
if (player.MaxArmor - player.Armor > 15) {
|
|
||||||
player.Armor += 15
|
|
||||||
// sendResponse(QuantityUpdateMessage(PlanetSideGUID(8214),ammo_quantity_left))
|
|
||||||
// sendResponse(RepairMessage(object_guid, player.Armor)) // Todo is that needed ?
|
|
||||||
sendResponse(PlanetsideAttributeMessage(player.GUID, 4, player.Armor))
|
|
||||||
avatarService ! AvatarServiceMessage(player.Continent, AvatarAction.PlanetsideAttribute(player.GUID, 4, player.Armor))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case _ => ;
|
|
||||||
}
|
|
||||||
} else if (tool.Definition.ObjectId == 531) {
|
|
||||||
// TODO : med app ?
|
|
||||||
continent.GUID(object_guid) match {
|
|
||||||
case Some(tplayer: Player) =>
|
|
||||||
if (player.GUID != tplayer.GUID && Vector3.Distance(player.Position, tplayer.Position) < 5 && player.Faction == tplayer.Faction && player.Velocity.isEmpty) {
|
|
||||||
if (tplayer.MaxHealth - tplayer.Health <= 10) {
|
|
||||||
tplayer.Health = tplayer.MaxHealth
|
|
||||||
// sendResponse(QuantityUpdateMessage(PlanetSideGUID(8214),ammo_quantity_left))
|
|
||||||
val RepairPercent: Int = tplayer.Health * 100 / tplayer.MaxHealth
|
|
||||||
sendResponse(RepairMessage(object_guid, RepairPercent))
|
|
||||||
avatarService ! AvatarServiceMessage(tplayer.Continent, AvatarAction.PlanetsideAttributeSelf(tplayer.GUID, 0, tplayer.Health))
|
|
||||||
avatarService ! AvatarServiceMessage(tplayer.Continent, AvatarAction.PlanetsideAttribute(tplayer.GUID, 0, tplayer.Health))
|
|
||||||
}
|
|
||||||
if (tplayer.MaxHealth - tplayer.Health > 10) {
|
|
||||||
tplayer.Health += 10
|
|
||||||
// sendResponse(QuantityUpdateMessage(PlanetSideGUID(8214),ammo_quantity_left))
|
|
||||||
val RepairPercent: Int = tplayer.Health * 100 / tplayer.MaxHealth
|
|
||||||
sendResponse(RepairMessage(object_guid, RepairPercent))
|
|
||||||
avatarService ! AvatarServiceMessage(tplayer.Continent, AvatarAction.PlanetsideAttributeSelf(tplayer.GUID, 0, tplayer.Health))
|
|
||||||
avatarService ! AvatarServiceMessage(tplayer.Continent, AvatarAction.PlanetsideAttribute(tplayer.GUID, 0, tplayer.Health))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case _ => ;
|
|
||||||
}
|
|
||||||
if (player.GUID == object_guid && player.Velocity.isEmpty) {
|
|
||||||
if (player.MaxHealth - player.Health <= 10) {
|
|
||||||
player.Health = player.MaxHealth
|
|
||||||
// sendResponse(QuantityUpdateMessage(PlanetSideGUID(8214),ammo_quantity_left))
|
|
||||||
// sendResponse(RepairMessage(object_guid, player.Health)) // Todo is that needed ?
|
|
||||||
sendResponse(PlanetsideAttributeMessage(player.GUID, 0, player.Health))
|
|
||||||
avatarService ! AvatarServiceMessage(player.Continent, AvatarAction.PlanetsideAttribute(player.GUID, 0, player.Health))
|
|
||||||
}
|
|
||||||
if (player.MaxHealth - player.Health > 10) {
|
|
||||||
player.Health += 10
|
|
||||||
// sendResponse(QuantityUpdateMessage(PlanetSideGUID(8214),ammo_quantity_left))
|
|
||||||
// sendResponse(RepairMessage(object_guid, player.Health)) // Todo is that needed ?
|
|
||||||
sendResponse(PlanetsideAttributeMessage(player.GUID, 0, player.Health))
|
|
||||||
avatarService ! AvatarServiceMessage(player.Continent, AvatarAction.PlanetsideAttribute(player.GUID, 0, player.Health))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
avatarService ! AvatarServiceMessage(tplayer.Continent, AvatarAction.PlanetsideAttributeToAll(tplayer.GUID, 4, tplayer.Armor))
|
||||||
|
} else if (player.GUID == tplayer.GUID && player.Velocity.isEmpty && tplayer.MaxArmor > 0) {
|
||||||
|
player.Armor += 15
|
||||||
|
tool.Discharge
|
||||||
|
sendResponse(InventoryStateMessage(tool.AmmoSlot.Box.GUID, obj.GUID, tool.Magazine))
|
||||||
|
avatarService ! AvatarServiceMessage(player.Continent, AvatarAction.PlanetsideAttributeToAll(player.GUID, 4, player.Armor))
|
||||||
|
}
|
||||||
|
case _ => ;
|
||||||
|
}
|
||||||
|
} else if (tool.Definition == GlobalDefinitions.medicalapplicator) {
|
||||||
|
continent.GUID(object_guid) match {
|
||||||
|
case Some(tplayer: Player) =>
|
||||||
|
if (player.GUID != tplayer.GUID && Vector3.Distance(player.Position, tplayer.Position) < 5 && player.Faction == tplayer.Faction && player.Velocity.isEmpty && tplayer.MaxHealth > 0) {
|
||||||
|
tplayer.Health += 10
|
||||||
|
tool.Discharge
|
||||||
|
sendResponse(InventoryStateMessage(tool.AmmoSlot.Box.GUID, obj.GUID, tool.Magazine))
|
||||||
|
val repairPercent: Int = tplayer.Health * 100 / tplayer.MaxHealth
|
||||||
|
sendResponse(RepairMessage(object_guid, repairPercent))
|
||||||
|
|
||||||
|
if(!tplayer.isAlive && tplayer.Health == tplayer.MaxHealth) {
|
||||||
|
tplayer.Revive
|
||||||
|
avatarService ! AvatarServiceMessage(tplayer.Continent, AvatarAction.Revive(tplayer.GUID))
|
||||||
|
}
|
||||||
|
|
||||||
|
if(tplayer.isAlive) {
|
||||||
|
avatarService ! AvatarServiceMessage(tplayer.Continent, AvatarAction.PlanetsideAttributeToAll(tplayer.GUID, 0, tplayer.Health))
|
||||||
|
}
|
||||||
|
} else if (player.GUID == tplayer.GUID && player.Velocity.isEmpty && tplayer.MaxHealth > 0) {
|
||||||
|
player.Health += 10
|
||||||
|
tool.Discharge
|
||||||
|
sendResponse(InventoryStateMessage(tool.AmmoSlot.Box.GUID, obj.GUID, tool.Magazine))
|
||||||
|
avatarService ! AvatarServiceMessage(player.Continent, AvatarAction.PlanetsideAttributeToAll(player.GUID, 0, player.Health))
|
||||||
|
}
|
||||||
|
case _ => ;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
case None => ;
|
case None => ;
|
||||||
}
|
}
|
||||||
|
|
@ -5160,11 +5140,14 @@ class WorldSessionActor extends Actor with MDCContextAware {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case Some(obj : SpawnTube) =>
|
case Some(obj : SpawnTube) =>
|
||||||
//deconstruction
|
if(item_used_guid == PlanetSideGUID(0)) { // Ensure that we're not trying to use a tool on the spawn tube, e.g. medical applicator
|
||||||
PlayerActionsToCancel()
|
//deconstruction
|
||||||
CancelAllProximityUnits()
|
PlayerActionsToCancel()
|
||||||
continent.Population ! Zone.Population.Release(avatar)
|
CancelAllProximityUnits()
|
||||||
GoToDeploymentMap()
|
continent.Population ! Zone.Population.Release(avatar)
|
||||||
|
GoToDeploymentMap()
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
case Some(obj : TelepadDeployable) =>
|
case Some(obj : TelepadDeployable) =>
|
||||||
continent.GUID(obj.Router) match {
|
continent.GUID(obj.Router) match {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue