示例#1
0
        public BaseVob CreateVob(byte type)
        {
            BaseVobInst vob;

            switch ((VobType)type)
            {
            case VobType.Vob:
                vob = new VobInst();
                break;

            case VobType.Mob:
                vob = new MobInst();
                break;

            case VobType.Item:
                vob = new ItemInst();
                break;

            case VobType.NPC:
                vob = new NPCInst();
                break;

            case VobType.Projectile:
                vob = new ProjInst();
                break;

            default:
                throw new Exception("Unsupported VobType: " + (VobType)type);
            }
            return(vob.BaseInst);
        }
示例#2
0
        public void TryShoot(Vec3f start, Vec3f end)
        {
            if (Host.IsDead || !Host.IsAiming())
            {
                return;
            }

            if (start.GetDistance(end) > 500000) // just in case
            {
                end = start + 500000 * (end - start).Normalise();
            }

            var drawnWeapon = Host.GetDrawnWeapon();

            if (drawnWeapon == null || !drawnWeapon.IsWepRanged)
            {
                return;
            }

            ItemInst ammo = drawnWeapon.ItemType == ItemTypes.WepBow ? Host.GetRightHand() : Host.GetLeftHand();

            if (ammo == null || !ammo.IsAmmo)
            {
                return;
            }

            ProjInst inst = new ProjInst(ProjDef.Get <ProjDef>("arrow"))
            {
                Item     = new ItemInst(ammo.Definition),
                Damage   = drawnWeapon.Damage,
                Velocity = 0.0004f,
                Model    = ammo.ModelDef
            };

            end = end - (end - start).Normalise() * (ammo.ItemType == ItemTypes.AmmoBow ? 40 : 10); // so arrows' bodies aren't 90% inside walls
            Host.DoShoot(start, end, inst);

            int ammoCount = ammo.Amount - 1;

            if (ammoCount <= 0)
            {
                Host.UnequipItem(ammo);
            }
            ammo.SetAmount(ammo.Amount - 1);
        }