Esempio n. 1
0
        public static void OnCharacterDeath(ICharacter deadCharacter)
        {
            var publicState = deadCharacter.GetPublicState <ICharacterPublicState>();

            if (!publicState.IsDead)
            {
                publicState.CurrentStats.ServerSetHealthCurrent(0);
                return;
            }

            // recreate physics (as dead character doesn't have any physics)
            deadCharacter.ProtoCharacter.SharedCreatePhysics(deadCharacter);

            if (deadCharacter.ProtoCharacter is IProtoCharacterMob protoCharacterMob)
            {
                Api.SafeInvoke(() => CharacterDeath?.Invoke(deadCharacter));
                protoCharacterMob.ServerOnDeath(deadCharacter);
                return;
            }

            // player character death
            // remember the death position (useful for the respawn)
            var privateState = PlayerCharacter.GetPrivateState(deadCharacter);

            privateState.LastDeathPosition = deadCharacter.TilePosition;
            privateState.LastDeathTime     = Api.Server.Game.FrameTime;
            ServerTimersSystem.AddAction(
                delaySeconds: PlayerTeleportToGraveyardDelaySeconds,
                () =>
            {
                if (!publicState.IsDead)
                {
                    // player has already respawned
                    return;
                }

                CharacterDespawnSystem.ServerTeleportPlayerCharacterToServiceArea(deadCharacter);
                CharacterRespawnSystem.ServerRemoveStatusEffectsOnRespawn(deadCharacter);
            });

            var isPvPdeath = CharacterDamageTrackingSystem.ServerGetPvPdamagePercent(deadCharacter)
                             >= 0.5;

            // register death (required even if the player is not a newbie)
            NewbieProtectionSystem.ServerRegisterDeath(deadCharacter,
                                                       isPvPdeath,
                                                       out var shouldSufferDeathConsequences);

            if (shouldSufferDeathConsequences)
            {
                DropPlayerLoot(deadCharacter);
            }
            else
            {
                Api.Logger.Important("Player character is dead - newbie PvP case, no loot drop or other consequences",
                                     deadCharacter);
            }

            Api.SafeInvoke(() => CharacterDeath?.Invoke(deadCharacter));
        }
Esempio n. 2
0
        public static void OnCharacterInitialize(ICharacter character)
        {
            if (character.IsNpc)
            {
                return;
            }

            if (PlayerCharacter.GetPublicState(character).IsDead)
            {
                CharacterDespawnSystem.ServerTeleportPlayerCharacterToServiceArea(character);
                CharacterRespawnSystem.ServerRemoveStatusEffectsOnRespawn(character);
            }
            else if (PlayerCharacter.GetPrivateState(character).IsDespawned)
            {
                CharacterDespawnSystem.ServerTeleportPlayerCharacterToServiceArea(character);
            }
        }