/* * public void PlayerKilled(ulong playerDead) * { * MonklandSteamManager.DataPacket packet = MonklandSteamManager.instance.GetNewPacket(CHANNEL, UtilityHandler); * BinaryWriter writer = MonklandSteamManager.instance.GetWriterForPacket(packet); * * //Write message type * writer.Write((byte)UtilMessageType.PlayerDead); * writer.Write(playerDead); * * MonklandSteamManager.instance.FinalizeWriterToPacket(writer, packet); * MonklandSteamManager.instance.SendPacketToAll(packet, false, EP2PSend.k_EP2PSendReliable); * * Debug.Log($"Writing packet: {packet.data}"); * } */ public void SendViolence(Creature self, BodyChunk source, Creature.DamageType type, float damage) { /* * Violence packet * packetType * damageType * sourceType (player/scav/lizard) * source ID */ if (self == null || AbstractPhysicalObjectHK.GetField(self.abstractPhysicalObject).networkObject) { return; } // Source ID field MonklandSteamManager.DataPacket packet = MonklandSteamManager.instance.GetNewPacket(CHANNEL, UtilityHandler); BinaryWriter writer = MonklandSteamManager.instance.GetWriterForPacket(packet); // SourceTemplate byte sourceTemplate = byte.MaxValue - 1; try { sourceTemplate = (byte)(source.owner.abstractPhysicalObject as AbstractCreature).creatureTemplate.TopAncestor().type; //sourceTemplate = (byte)((source.owner as Creature).abstractCreature.creatureTemplate.type); } catch (Exception e) { Debug.Log("Error getting source type " + e.Message); } // SourceID ulong sourceID = 0; try { sourceID = (AbstractPhysicalObjectHK.GetField(source.owner.abstractPhysicalObject).owner); } catch { } //(Exception e) {/*Debug.Log()*/} // Message type writer.Write((byte)UtilMessageType.PlayerViolence); // Damage type writer.Write((byte)type); // Damage writer.Write((bool)(damage >= 1f)); // Source Template writer.Write(sourceTemplate); // Source ID writer.Write(sourceID); MonklandSteamManager.Log($"[GameMNG] Sending Player Violence: Type {type}, damage {damage} Source Template {(CreatureTemplate.Type)sourceTemplate}, Source ID {sourceID}"); MonklandSteamManager.instance.FinalizeWriterToPacket(writer, packet); MonklandSteamManager.instance.SendPacketToAll(packet, false, EP2PSend.k_EP2PSendReliable); }
private void ReadViolence(BinaryReader br, CSteamID sentPlayer) { // Message type // Damage type Creature.DamageType type = (Creature.DamageType)br.ReadByte(); // Lethal bool lethal = br.ReadBoolean(); // Source Template CreatureTemplate.Type sourceTemplate = (CreatureTemplate.Type)br.ReadByte(); // Source ID ulong sourceID = (ulong)br.ReadUInt64(); if (lethal) { string message = MonklandUI.BuildDeathMessage(sentPlayer, type, sourceTemplate, sourceID); Debug.Log(message); MonklandUI.AddMessage(message, 10); } MonklandSteamManager.Log($"[GameMNG] Reading Player Violence: Damage type {type}, Source Template {sourceTemplate}, Source ID {sourceID}"); }
public static string BuildDeathMessage(CSteamID deadPlayerID, Creature.DamageType damageType, CreatureTemplate.Type killerType, ulong killerID) { string deadPlayerName = SteamFriends.GetFriendPersonaName(deadPlayerID); string message = string.Empty; switch (damageType) { case Creature.DamageType.Blunt: message = $"{deadPlayerName} was killed using blunt force"; break; case Creature.DamageType.Stab: message = $"{deadPlayerName} was stabbed to death"; break; case Creature.DamageType.Bite: message = $"{deadPlayerName} was bitten to death"; break; case Creature.DamageType.Water: message = $"{deadPlayerName} drowned"; break; case Creature.DamageType.Explosion: message = $"{deadPlayerName} was blown up"; break; case Creature.DamageType.Electric: message = $"{deadPlayerName} was shocked to death"; break; } // Generic death message if (message.Equals(string.Empty)) { message = $"{deadPlayerName} was killed"; } string killerName = SteamFriends.GetFriendPersonaName((CSteamID)killerID); if (killerName.Equals(string.Empty)) { killerName = "Player"; } // TO DO -- When creatures are synced -- else if (killerType != CreatureTemplate.Type.Slugcat) { killerName = killerType.ToString(); } if (killerName != string.Empty && damageType != Creature.DamageType.Water && damageType != Creature.DamageType.Electric) { message += $" by {killerName}"; } Debug.Log($"Debug {message}"); return(message); }
private static void Creature_Violence(On.Creature.orig_Violence orig, Creature self, BodyChunk source, UnityEngine.Vector2?directionAndMomentum, BodyChunk hitChunk, PhysicalObject.Appendage.Pos hitAppendage, Creature.DamageType type, float damage, float stunBonus) { if (self is Player && !AbstractPhysicalObjectHK.GetField(self.abstractPhysicalObject).networkObject&& !self.dead) { /* * #Violence packet# * packetType * source * damageType */ if (MonklandSteamManager.isInGame) { MonklandSteamManager.GameManager.SendViolence(self, source, type, damage); } } orig(self, source, directionAndMomentum, hitChunk, hitAppendage, type, damage, stunBonus); }
//Add scavs to the flee list, changing their behaviour to LeaveRoom while they're in it private static void Scavenger_Violence(On.Scavenger.orig_Violence orig, Scavenger self, BodyChunk source, Vector2?directionAndMomentum, BodyChunk hitChunk, PhysicalObject.Appendage.Pos hitAppendage, Creature.DamageType type, float damage, float stunBonus) { if (Flee && self.room != null && self.room.abstractRoom.shelter && self.room.world.game.IsStorySession) { shelter = self.room.abstractRoom.name; fleeList.Add(self); self.AI.behavior = ScavengerAI.Behavior.LeaveRoom; } orig.Invoke(self, source, directionAndMomentum, hitChunk, hitAppendage, type, damage, stunBonus); }