예제 #1
0
            public void SetItem(ItemInst item)
            {
                if (this.item == item)
                {
                    return;
                }
                this.item = item;

                UpdateBackTex();
                if (item == null)
                {
                    vis.SetVisual(string.Empty);
                    vis.Hide();
                }
                else
                {
                    vis.SetVisual(item.ModelDef.Visual);
                    if (shown)
                    {
                        vis.Show();
                    }
                    int num = item.Amount;
                    if (num > 1)
                    {
                        amount.Text = num.ToString();
                    }
                    else
                    {
                        amount.Text = string.Empty;
                    }

                    item.Definition.PositionInVobVisual(vis);
                }
            }
예제 #2
0
 public void Open(ItemInst item)
 {
     maxAmount = item.Amount;
     tb.Input  = maxAmount.ToString();
     Open();
     this.item = item;
 }
예제 #3
0
        void UpdateAmmo(ItemInst rangedWeapon = null)
        {
            ItemInst item = rangedWeapon ?? Host.GetEquipmentBySlot(NPCSlots.Ranged);

            if (item == null)
            {
                return;
            }

            ItemInst  currentAmmo = Host.GetAmmo();
            ItemTypes ammoType    = item.ItemType == ItemTypes.WepXBow ? ItemTypes.AmmoXBow : ItemTypes.AmmoBow;

            if (currentAmmo == null || currentAmmo.ItemType != ammoType) // no ammo equipped or wrong type
            {
                Host.Inventory.ForEachItemPredicate(i =>
                {
                    if (i.ItemType == ammoType)
                    {
                        if (currentAmmo != null)
                        {
                            Host.UnequipItem(currentAmmo);
                        }
                        Host.EquipItem(NPCSlots.Ammo, i);
                        return(false);
                    }
                    return(true);
                });
            }
        }
예제 #4
0
        static NPCInst SpawnEnemy(HordeEnemy enemy, Vec3f spawnPoint, float spawnRange = 100)
        {
            NPCInst npc = new NPCInst(NPCDef.Get(enemy.NPCDef));

            if (enemy.WeaponDef != null)
            {
                ItemInst item = new ItemInst(ItemDef.Get(enemy.WeaponDef));
                npc.Inventory.AddItem(item);
                npc.EffectHandler.TryEquipItem(item);
            }

            if (enemy.ArmorDef != null)
            {
                ItemInst item = new ItemInst(ItemDef.Get(enemy.ArmorDef));
                npc.Inventory.AddItem(item);
                npc.EffectHandler.TryEquipItem(item);
            }

            npc.SetHealth(enemy.Health, enemy.Health);

            Vec3f  spawnPos = Randomizer.GetVec3fRad(spawnPoint, spawnRange);
            Angles spawnAng = Randomizer.GetYaw();

            //npc.TeamID = 1;
            npc.BaseInst.SetNeedsClientGuide(true);
            npc.Spawn(activeWorld, spawnPos, spawnAng);
            return(npc);
        }
예제 #5
0
        static void SpawnPlayer(ArenaClient client)
        {
            var     charInfo = client.CharInfo;
            NPCInst npc      = new NPCInst(NPCDef.Get(charInfo.BodyMesh == HumBodyMeshs.HUM_BODY_NAKED0 ? "maleplayer" : "femaleplayer"))
            {
                UseCustoms     = true,
                CustomBodyTex  = charInfo.BodyTex,
                CustomHeadMesh = charInfo.HeadMesh,
                CustomHeadTex  = charInfo.HeadTex,
                CustomVoice    = charInfo.Voice,
                CustomFatness  = charInfo.Fatness,
                CustomScale    = new Vec3f(charInfo.BodyWidth, 1.0f, charInfo.BodyWidth),
                CustomName     = charInfo.Name
            };

            foreach (string e in client.HordeClass.Equipment)
            {
                ItemInst item = new ItemInst(ItemDef.Get(e));
                npc.Inventory.AddItem(item);
                npc.EffectHandler.TryEquipItem(item);
            }

            if (client.HordeClass.NeedsBolts)
            {
            }

            npc.Inventory.AddItem(new ItemInst(ItemDef.Get("hptrank")));

            Vec3f  spawnPos = Randomizer.GetVec3fRad(activeDef.SpawnPos, activeDef.SpawnRange);
            Angles spawnAng = Randomizer.GetYaw();

            //npc.TeamID = 0;
            npc.Spawn(activeWorld, spawnPos, spawnAng);
            client.SetControl(npc);
        }
예제 #6
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);
        }
예제 #7
0
        void SelectSlot()
        {
            slots[cursor.X, cursor.Y].IsSelected = true;

            ItemInst selItem = GetSelectedItem();

            if (selItem == null)
            {
                descrBack.Hide();
                descrVis.Hide();
            }
            else
            {
                List <GUCVisualText> texts = descrBack.Texts;
                var def = selItem.Definition;

                //set description name
                texts[0].Text = def.Name;

                if (def.Damage != 0)
                {
                    texts[3].Text = "Schaden";
                    texts[4].Text = def.Damage.ToString();
                }
                else
                {
                    texts[3].Text = texts[4].Text = "";
                }

                if (def.Range != 0)
                {
                    texts[5].Text = "Reichweite";
                    texts[6].Text = def.Range.ToString();
                }
                else
                {
                    texts[5].Text = texts[6].Text = "";
                }

                if (def.Protection != 0)
                {
                    texts[7].Text = "Schutz vor Waffen";
                    texts[8].Text = def.Protection.ToString();
                }
                else
                {
                    texts[7].Text = texts[8].Text = "";
                }

                //visual vob
                descrVis.SetVisual(selItem.ModelDef.Visual);

                //show description
                def.PositionInVobVisual(descrVis);

                descrBack.Show();
                descrVis.Show();
            }
        }
예제 #8
0
        public void UseItem(NPCInst npc, ItemInst item)
        {
            var stream = npc.BaseInst.GetScriptCommandStream();

            stream.Write((byte)RequestMessageIDs.UseItem);
            stream.Write((ushort)item.ID);
            NPC.SendScriptCommand(stream, NetPriority.Low);
        }
예제 #9
0
        public void TryDrawWeapon(ItemInst item)
        {
            if (item == null)
            {
                return;
            }

            if (Host.IsDead || this.Host.ModelInst.IsInAnimation())
            {
                return;
            }

            if (Host.GetDrawnWeapon() != null)
            {
                Host.DoUndrawWeapon(item);
            }

            ItemInst removeItem = Host.GetRightHand();

            if (removeItem != null)
            {
                if (removeItem.IsWeapon)
                {
                    Host.DoUndrawWeapon(removeItem);
                    return;
                }
                else
                {
                    this.TryUnequipItem(removeItem);
                    if (removeItem.IsEquipped) // still equipped?
                    {
                        return;                // dunno
                    }
                }
            }

            removeItem = Host.GetLeftHand();
            if (removeItem != null && (item.ItemType != ItemTypes.Wep1H || Host.GetEquipmentBySlot(NPCSlots.OneHanded2) != null))
            {
                if (removeItem.IsWeapon)
                {
                    Host.DoUndrawWeapon(removeItem);
                    return;
                }
                else
                {
                    this.TryUnequipItem(removeItem);
                    if (removeItem.IsEquipped) // still equipped?
                    {
                        return;                // dunno
                    }
                }
            }

            // Hands should be free now
            this.Host.DoDrawWeapon(item);
        }
예제 #10
0
        public void TryUse(ItemInst item)
        {
            if (item == null || this.Host.IsObstructed())
            {
                return;
            }

            this.Host.UseItem(item);
        }
예제 #11
0
        public void FMSpawn()
        {
            if (GameMode.IsActive)
            {
                GameMode.ActiveMode.Leave(this);
            }

            KillCharacter();
            SetTeamID(TeamIdent.FFAPlayer);

            NPCDef  def = NPCDef.Get(charInfo.BodyMesh == HumBodyMeshs.HUM_BODY_NAKED0 ? "maleplayer" : "femaleplayer");
            NPCInst npc = new NPCInst(def)
            {
                UseCustoms             = true,
                CustomBodyTex          = charInfo.BodyTex,
                CustomHeadMesh         = charInfo.HeadMesh,
                CustomHeadTex          = charInfo.HeadTex,
                CustomVoice            = charInfo.Voice,
                CustomFatness          = charInfo.Fatness,
                CustomScale            = new Vec3f(charInfo.BodyWidth, 1.0f, charInfo.BodyWidth),
                CustomName             = charInfo.Name,
                DropUnconsciousOnDeath = true,
                UnconsciousDuration    = 15 * TimeSpan.TicksPerSecond,
            };

            ItemDef.ForEach(itemDef =>
            {
                var item = new ItemInst(itemDef);
                npc.Inventory.AddItem(item);
                if (string.Equals(itemDef.CodeName, "ItMw_1h_Bau_Mace", StringComparison.OrdinalIgnoreCase) ||
                    string.Equals(itemDef.CodeName, "ITAR_Prisoner", StringComparison.OrdinalIgnoreCase))
                {
                    npc.EffectHandler.TryEquipItem(item);
                }
                else if (itemDef.ItemType == ItemTypes.AmmoBow || itemDef.ItemType == ItemTypes.AmmoXBow)
                {
                    item.SetAmount(100);
                }
            });

            if (npc.ModelDef.TryGetOverlay("1HST1", out ScriptOverlay ov))
            {
                npc.ModelInst.ApplyOverlay(ov);
            }
            if (npc.ModelDef.TryGetOverlay("2HST1", out ov))
            {
                npc.ModelInst.ApplyOverlay(ov);
            }

            var pair = spawnPositions.GetRandom();

            npc.Spawn(WorldInst.List[0], pair.Item1, pair.Item2);
            this.SetControl(npc);
            npc.AllowHitAttacker.Add(DuelMode.CheckHitDetection);
        }
        public NewItemPage()
        {
            InitializeComponent();

            ItemInst = new ItemInst
            {
                Text        = "ItemInst name",
                Description = "This is an itemInst description."
            };

            BindingContext = this;
        }
예제 #13
0
        public void DrawWeapon(NPCInst npc, ItemInst item)
        {
            if (npc == null || item == null)
            {
                return;
            }

            var stream = npc.BaseInst.GetScriptCommandStream();

            stream.Write((byte)RequestMessageIDs.DrawWeapon);
            stream.Write((byte)item.ID);
            NPC.SendScriptCommand(stream, NetPriority.Medium);
        }
        public ItemDetailPage()
        {
            InitializeComponent();

            var item = new ItemInst
            {
                Text        = "ItemInst 1",
                Description = "This is an itemInst description."
            };

            viewModel      = new ItemDetailViewModel(item);
            BindingContext = viewModel;
        }
예제 #15
0
        public void TryDropItem(ItemInst item, int amount)
        {
            if (item == null || this.Host.IsObstructed())
            {
                return;
            }

            var pos = this.Host.GetPosition();
            var ang = this.Host.GetAngles();

            pos += ang.ToAtVector() * 100f;

            this.Host.DoDropItem(item, amount, pos, ang);
        }
예제 #16
0
        protected override void Start(GameScenario scenario)
        {
            base.Start(scenario);

            if (Scenario.SpawnBarriers != null)
            {
                foreach (var bar in Scenario.SpawnBarriers)
                {
                    if (!bar.AddAfterEvent)
                    {
                        spawnBarriers.Add(CreateBarrier(bar));
                    }
                }
            }

            foreach (var hi in Scenario.Items)
            {
                ItemInst item = new ItemInst(ItemDef.Get(hi.ItemDef));
                item.Spawn(World, hi.Position, hi.Angles);
            }

            for (int i = 0; i < Scenario.Stands.Length; i++)
            {
                var       stand = Scenario.Stands[i];
                StandInst inst  = new StandInst()
                {
                    Index = i,
                    Stand = stand,
                };

                if (stand.Boss != null)
                {
                    inst.Boss = SpawnNPC(stand.Boss, stand.Position);
                    inst.Boss.AllowHitTarget.Add(BossProtection);
                }

                inst.Barriers = new List <VobInst>(stand.Barriers.Length);
                foreach (var bar in stand.Barriers)
                {
                    if (!bar.AddAfterEvent)
                    {
                        inst.Barriers.Add(CreateBarrier(bar));
                    }
                }

                Stands.Add(inst);
            }
        }
예제 #17
0
        static void SpawnItem(WorldInst world, PosAng posAng)
        {
            var item = BRScenario.Items.GetRandom();

            ItemDef def = ItemDef.Get(item.Definition);

            if (def == null)
            {
                return;
            }

            ItemInst inst = new ItemInst(def);

            inst.SetAmount(item.Amount);
            inst.Spawn(world, posAng.Position, posAng.Angles);
        }
예제 #18
0
        public void TryTakeItem(ItemInst item)
        {
            if (item == null || !item.IsSpawned || this.Host.IsObstructed())
            {
                return;
            }

            var potion = ItemDef.Get("hptrank");

            if (item.Definition == potion && Host.Inventory.Contains(potion))
            {
                Host.ModelInst.StartAniJob(Host.AniCatalog.Gestures.DontKnow);
                return;
            }

            this.Host.DoTakeItem(item);
        }
예제 #19
0
        public void TryUndrawWeapon(ItemInst item)
        {
            if (item == null)
            {
                return;
            }

            if (Host.IsDead || this.Host.ModelInst.IsInAnimation())
            {
                return;
            }

            if (Host.GetRightHand() == item || Host.GetLeftHand() == item)
            {
                Host.DoUndrawWeapon(item);
            }
        }
예제 #20
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);
        }
예제 #21
0
        public void TryUnequipItem(ItemInst item)
        {
            if (item == null || Host.IsObstructed())
            {
                return;
            }

            Host.UnequipItem(item);
            switch (item.ItemType)
            {
            case ItemTypes.Wep1H:
                Host.UnequipSlot(NPCSlots.OneHanded2);
                break;

            case ItemTypes.Torch:
                if (Host.ModelDef.TryGetOverlay("humans_torch", out Visuals.ScriptOverlay ov))
                {
                    this.Host.ModelInst.RemoveOverlay(ov);
                }
                break;
            }
        }
예제 #22
0
        public static NPCInst CreateDummyInst(NPCDef npcDef, string name, Types.Vec3f spawnPosition, Random random)
        {
            random = random ?? new Random();

            int guild      = random.Next(0, 2);
            int armorType  = random.Next(0, 4);
            int meleeType  = random.Next(0, 4);
            int rangedType = random.Next(0, 2);

            NPCInst npcInst = null;

            npcInst = new NPCInst(npcDef);
            npcInst.SetObjName(name);
            npcInst.BaseInst.SetNeedsClientGuide(true);

            ItemInst      armor = null, weapon = null, rangeWeapon = null, ammo = null;
            int           ammoAmount;
            ScriptOverlay overlay       = null;
            bool          overlayExists = false;

            armor = new ItemInst(ItemDef.Get <ItemDef>(ArmorCodes[random.Next(0, ArmorCodes.Count)]));

            // melee weapon
            if (random.Next(0, 2) == 0)
            {
                // 1H-weapon
                weapon        = new ItemInst(ItemDef.Get <ItemDef>(WeaponCodes_1H[random.Next(0, WeaponCodes_1H.Count)]));
                overlayExists = npcInst.ModelDef.TryGetOverlay("1HST2", out overlay);
            }
            else
            {
                // 2H-weapon
                weapon        = new ItemInst(ItemDef.Get <ItemDef>(WeaponCodes_2H[random.Next(0, WeaponCodes_2H.Count)]));
                overlayExists = npcInst.ModelDef.TryGetOverlay("2HST1", out overlay);
            }

            // ranged weapon
            if (random.Next(0, 2) == 0)
            {
                // bow
                rangeWeapon = new ItemInst(ItemDef.Get <ItemDef>(WeaponCodes_Bow[random.Next(0, WeaponCodes_Bow.Count)]));
                ammo        = new ItemInst(ItemDef.Get <ItemDef>(AmmoCodes_Bow[random.Next(0, AmmoCodes_Bow.Count)]));
            }
            else
            {
                // crossbow
                rangeWeapon = new ItemInst(ItemDef.Get <ItemDef>(WeaponCodes_Crossbow[random.Next(0, WeaponCodes_Crossbow.Count)]));
                ammo        = new ItemInst(ItemDef.Get <ItemDef>(AmmoCodes_Crossbow[random.Next(0, AmmoCodes_Crossbow.Count)]));
            }

            ammoAmount = random.Next(10, 500 + 1);
            ammo.BaseInst.SetAmount(ammoAmount);

            npcInst.Inventory.AddItem(weapon);
            npcInst.EffectHandler.TryEquipItem(weapon); // 1 = DrawnWeapon

            npcInst.Inventory.AddItem(rangeWeapon);
            npcInst.EffectHandler.TryEquipItem(rangeWeapon);

            npcInst.Inventory.AddItem(ammo);
            npcInst.EffectHandler.TryEquipItem(ammo);

            npcInst.Inventory.AddItem(armor);
            npcInst.EffectHandler.TryEquipItem(armor);

            if (overlayExists)
            {
                npcInst.ModelInst.ApplyOverlay(overlay);
            }

            npcInst.Spawn(WorldSystem.WorldInst.List[0], spawnPosition, Types.Angles.Null);

            return(npcInst);
        }
예제 #23
0
 public void RemoveItem(ItemInst item)
 {
     BaseInst.Remove(item.BaseInst);
     item.OnSetAmount -= Item_OnSetAmount;
     OnRemoveItem?.Invoke(item);
 }
예제 #24
0
 public void UpdateAmountEventMethod(ItemInst item)
 {
     inv.UpdateAmounts();
 }
예제 #25
0
        protected override void KeyPress(VirtualKeys key, bool hold)
        {
            switch (key)
            {
            case VirtualKeys.Escape:
            case VirtualKeys.Tab:
                if (!hold)
                {
                    Close();
                }
                break;

            case VirtualKeys.Menu:     // DROP
                if (!hold && player != null && !Arena.ArenaClient.GMJoined)
                {
                    ItemInst selectedItem = inv.GetSelectedItem();
                    if (selectedItem != null)
                    {
                        if (selectedItem.Amount > 1)
                        {
                            DropItemMenu.Menu.Open(selectedItem);
                        }
                        else if (selectedItem.Amount == 1)
                        {
                            NPCInst.Requests.DropItem(player, selectedItem, 1);
                        }
                    }
                }
                break;

            case VirtualKeys.Control:     // USE
                if (!hold)
                {
                    ItemInst selItem = inv.GetSelectedItem();
                    if (selItem == null)
                    {
                        return;
                    }

                    switch (selItem.ItemType)
                    {
                    case ItemTypes.Wep1H:
                    case ItemTypes.Wep2H:
                    case ItemTypes.WepBow:
                    case ItemTypes.WepXBow:
                    case ItemTypes.Armor:
                    case ItemTypes.Torch:
                        if (selItem.ItemType == ItemTypes.Torch || !Arena.ArenaClient.GMJoined)
                        {
                            if (selItem.IsEquipped)
                            {
                                NPCInst.Requests.UnequipItem(player, selItem);
                            }
                            else
                            {
                                NPCInst.Requests.EquipItem(player, selItem);
                            }
                        }
                        break;

                    default:
                        NPCInst.Requests.UseItem(player, selItem);
                        break;
                    }
                }
                break;

            default:
                inv.KeyPressed(key);
                break;
            }
        }
예제 #26
0
 public void UpdateInventory(ItemInst item)
 {
     UpdateContents();
 }
예제 #27
0
        protected override void Fight()
        {
            foreach (var bar in spawnBarriers)
            {
                bar.Despawn();
            }
            spawnBarriers.Clear();

            if (Scenario.SpawnBarriers != null)
            {
                foreach (var bar in Scenario.SpawnBarriers)
                {
                    if (bar.AddAfterEvent)
                    {
                        CreateBarrier(bar);
                    }
                }
            }

            foreach (var group in Scenario.Enemies)
            {
                var agent = CreateAgent();
                foreach (var pair in group.npcs)
                {
                    int maxCount = (int)Math.Ceiling(pair.CountScale * players.Count);
                    for (int i = 0; i < maxCount; i++)
                    {
                        agent.Add(SpawnNPC(pair.Enemy, group.Position, group.Range));
                    }
                }
            }

            foreach (var group in Scenario.AmbientNPCs)
            {
                foreach (var pair in group.npcs)
                {
                    for (int i = 0; i < pair.CountScale; i++)
                    {
                        var      npc    = SpawnNPC(pair.Enemy, group.Position, new Angles(0, group.Yaw, 0), group.Range, 0, false);
                        ItemInst weapon = npc.GetEquipmentBySlot(NPCSlots.TwoHanded);
                        if (weapon == null)
                        {
                            weapon = npc.GetEquipmentBySlot(NPCSlots.OneHanded1);
                        }
                        if (weapon != null)
                        {
                            npc.DoDrawWeapon(weapon);
                        }
                        AmbientNPCs.Add(npc);
                    }
                }
            }

            standTimer.SetInterval(TimeSpan.TicksPerSecond);
            standTimer.SetCallback(CheckStandDistance);
            standTimer.Start();

            base.Fight();

            NPCInst.sOnHit += OnHit;
        }
예제 #28
0
 private void Player_OnUnequip(ItemInst item)
 {
     UpdateEquipment();
 }
예제 #29
0
        static void Update()
        {
            NPCInst hero = currentPlayer;

            if (hero == null)
            {
                Deactivate();
                return;
            }

            float maxYaw    = Angles.Deg2Rad(60);
            bool  fightMode = hero.IsInFightMode;

            ItemInst wep      = hero.GetDrawnWeapon();
            float    maxRange = (fightMode && wep != null && wep.IsWepRanged) ? 3000 : 400;

            Vec3f  heroPos = hero.GetPosition();
            Angles heroAng = hero.GetAngles();

            float       bestFit = 2.0f;
            BaseVobInst bestVob = null;

            if (hero?.World?.BaseWorld != null)
            {
                hero.World.BaseWorld.ForEachVob(v =>
                {
                    BaseVobInst vob = (BaseVobInst)v.ScriptObject;
                    if (vob == hero)
                    {
                        return;
                    }

                    bool hasPriority = false;
                    if (fightMode)
                    {
                        if (!(vob is NPCInst npc))
                        {
                            return;
                        }

                        if (npc.IsDead)
                        {
                            return;
                        }

                        if (bestVob != null)
                        {
                            NPCInst bestNPC = (NPCInst)bestVob;
                            if (npc.IsUnconscious)
                            {
                                if (!bestNPC.IsUnconscious)
                                {
                                    return; // alive targets are more important
                                }
                            }
                            else
                            {
                                if (bestNPC.IsUnconscious)
                                {
                                    hasPriority = true;
                                }
                            }

                            if (npc.TeamID == hero.TeamID)
                            {
                                if (bestNPC.TeamID != hero.TeamID)
                                {
                                    return;
                                }
                            }
                            else
                            {
                                if (bestNPC.TeamID == hero.TeamID)
                                {
                                    hasPriority = true;
                                }
                            }
                        }
                    }

                    Vec3f targetPos;
                    using (zVec3 z = zVec3.Create())
                    {
                        vob.BaseInst.gVob.BBox3D.GetCenter(z);
                        targetPos = (Vec3f)z;
                    }

                    float distance = heroPos.GetDistance(targetPos);
                    if (distance > maxRange)
                    {
                        return;
                    }

                    float yaw = Angles.GetYawFromAtVector(targetPos - heroPos);
                    yaw       = Math.Abs(Angles.Difference(yaw, heroAng.Yaw));
                    if (yaw > maxYaw)
                    {
                        return; // target is not in front of hero
                    }
                    if (!CanSee(heroPos, targetPos, vob))
                    {
                        return;
                    }

                    float fit = distance / maxRange + yaw / maxYaw;
                    if (hasPriority || fit < bestFit)
                    {
                        bestVob = vob;
                        bestFit = fit;
                    }
                });

                SetFocus(bestVob);
            }
        }
예제 #30
0
 void Player_OnEquip(ItemInst item)
 {
     UpdateEquipment();
 }