Example #1
0
        protected override async Task Handle(MonsterDeathEvent e, CancellationToken cancellation)
        {
            if (!(e.Sender is IMonsterEntity monster))
            {
                return;
            }

            // Clear Buff/Debuff
            // Set respawn
            if (e.Killer is IPlayerEntity player)
            {
                NpcMonsterDto npcMonster = monster.NpcMonster;
                float ExpPenality(int lvlDif) => lvlDif < 5 ? 1 : (lvlDif < 10 ? 0.9f - 0.2f * (lvlDif - 6) : lvlDif < 19 ? 0.1f : 0.05f) * (2 / 3f);

                long xp     = (long)(npcMonster.Xp * ExpPenality(player.Level - npcMonster.Level));
                long jobXp  = (long)(npcMonster.JobXp * ExpPenality(player.JobLevel - npcMonster.Level));
                long heroXp = (long)(npcMonster.HeroXp * ExpPenality(player.Level - npcMonster.Level));
                await player.EmitEventAsync(new ExperienceGainEvent { Experience = xp, JobExperience = jobXp, HeroExperience = heroXp });
            }

            if (Random.Next(100) < 100) // 100 should be modified with GoldDropRate
            {
                Position <short>[] pos  = PathFinder.GetNeighbors(monster.Position, monster.CurrentMap.Map);
                IDropEntity        drop = new ItemDropEntity(monster.CurrentMap.GetNextId())
                {
                    ItemVnum       = 1046,
                    IsGold         = true,
                    DroppedTimeUtc = DateTime.Now,
                    Position       = pos.Length > 1 ? pos[Random.Next(pos.Length)] : monster.Position,
                    Quantity       = Random.Next(6 * monster.NpcMonster.Level, 12 * monster.NpcMonster.Level)
                };
                drop.TransferEntity(monster.CurrentMap);
                await monster.CurrentMap.BroadcastAsync(drop.GenerateDropPacket());
            }
        }
Example #2
0
 void OnDrawGizmos()
 {
     if (_pathfinder != null)
     {
         foreach (var node in _pathfinder.GetGrid())
         {
             if (node.walkable)
             {
                 Gizmos.color = Color.white;
             }
             else
             {
                 Gizmos.color = Color.black;
             }
             Gizmos.DrawSphere(node.worldPosition, 0.2f);
             foreach (var nodeNeigbor in _pathfinder.GetNeighbors(node, 2.1f))
             {
                 Gizmos.DrawLine(node.worldPosition, nodeNeigbor.worldPosition);
             }
         }
         if (lastWaypoints != null)
         {
             Gizmos.color = Color.red;
             foreach (var node in lastWaypoints)
             {
                 Gizmos.DrawSphere(node.worldPosition, 0.2f);
                 foreach (var nodeNeigbor in _pathfinder.GetNeighbors(node, 2.1f))
                 {
                     if (lastWaypoints.Contains(nodeNeigbor))
                     {
                         Gizmos.DrawLine(node.worldPosition, nodeNeigbor.worldPosition);
                     }
                 }
             }
         }
     }
 }
Example #3
0
 void OnDrawGizmos()
 {
     if (_pathfinder != null)
     {
         /*Gizmos.color = Color.blue;
          * Gizmos.DrawSphere(botPosition, 0.3f);
          * Gizmos.DrawLine(transform.position, transform.position + forward * height);
          * foreach (var node in _pathfinder.GetGrid())
          * {
          *  if (node.walkable)
          *      Gizmos.color = Color.white;
          *  else
          *  {
          *      Gizmos.color = Color.black;
          *  }
          *  Gizmos.DrawSphere(node.worldPosition, 0.2f);
          *  foreach (var nodeNeigbor in _pathfinder.GetNeighbors(node, 2.1f))
          *  {
          *      Gizmos.DrawLine(node.worldPosition, nodeNeigbor.worldPosition);
          *  }
          * }*/
         if (Route != null)
         {
             Gizmos.color = Color.red;
             foreach (var node in Route)
             {
                 Gizmos.DrawSphere(node.worldPosition, 0.2f);
                 foreach (var nodeNeigbor in _pathfinder.GetNeighbors(node, 2.1f))
                 {
                     if (Route.Contains(nodeNeigbor))
                     {
                         Gizmos.DrawLine(node.worldPosition, nodeNeigbor.worldPosition);
                     }
                 }
             }
         }
         if (CurrentNode != null)
         {
             Gizmos.color = Color.magenta;
             Gizmos.DrawSphere(CurrentNode.worldPosition, 0.2f);
         }
     }
 }
        protected override async Task Handle(InventoryRemoveItemEvent e, CancellationToken cancellation)
        {
            if (!(e.Sender is IPlayerEntity player) || e.ItemInstance?.Item.IsDroppable == false)
            {
                return;
            }


            ItemInstanceDto[] subinv = player.Inventory.GetSubInvFromItem(e.ItemInstance.Item);

            Position <short>[] pos = _pathFinder.GetNeighbors(player.Position, player.CurrentMap.Map);

            // create a new item
            if (e.Amount < e.ItemInstance.Amount)
            {
                ItemInstanceDto tmp = _itemFactory.Duplicate(e.ItemInstance);
                e.ItemInstance.Amount -= e.Amount;
                tmp.Amount             = e.Amount;
                await player.ActualizeUiInventorySlot(e.ItemInstance.Type, e.ItemInstance.Slot);

                e.ItemInstance = tmp;
            }
            else
            {
                subinv[e.ItemInstance.Slot] = null;
                await player.ActualizeUiInventorySlot(e.ItemInstance.Type, e.ItemInstance.Slot);
            }

            IDropEntity drop = new ItemDropEntity(player.CurrentMap.GetNextId())
            {
                ItemVnum       = e.ItemInstance.ItemId,
                Item           = e.ItemInstance.Item,
                ItemInstance   = e.ItemInstance,
                DroppedTimeUtc = DateTime.Now,
                Position       = pos.Length > 1 ? pos[_random.Next(pos.Length)] : player.Position,
                Quantity       = e.Amount < e.ItemInstance.Amount ? e.Amount : e.ItemInstance.Amount
            };

            drop.TransferEntity(player.CurrentMap);
            await player.CurrentMap.BroadcastAsync(drop.GenerateDropPacket());
        }