예제 #1
0
        /*
         * 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);
        }
예제 #2
0
        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}");
        }
예제 #3
0
        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);
        }
예제 #4
0
        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);
        }
예제 #5
0
 //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);
 }