Example #1
0
        /* Fires when a weapon hits a target.
         * If sender == NULL, this mean we pseudofired this event from
         * executeServerCommand().
         * IE: what happened is that we had a hit on the server side but by the time it reached here to propogate,
         * this local Weapons class had disposed of the local copy of the projectile.
         * However, we still need to propogate the hit.
         * */
        public void eventHit(Explosive sender,
                             Projector target,
                             int damageAmount, //0 if from server or LTS
                             WeaponTypes type) //Used if weapon has been deleted by the time hit event registers on server
        {
            if (sender != null)
            {
                sender.eventHit -= eventHit;
            }

            bool killed = target.damage - damageAmount <= 0;

            if (killed)
            {
                target.indicateDestroyedBy(creator.name, creator.id);
            }
            if (!executingServerData && target.isSender())
            {
                writer.Write(sender.id.Replace(creator.id, null));
                writer.Write(target.id);
                writer.Write((byte)type);
                writer.Flush();
                weaponEvents++;
            }
            if (!executingServerData && !(sender is LaserCannonSystem)) //we already get new damage value from server.
            {
                target.hit(damageAmount, Interaction.Cause.destroyedByWeapon);
            }
            if (killed)
            {
                if (destroy != null)
                {
                    destroy(target);
                }
                return;
            }
            if (strike != null)
            {
                strike(type == WeaponTypes.laserCannonSystem);
            }
            if (sender == null)
            {
                doNullSender(type, target);
            }
        }