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()); } }
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); } } } } } }
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()); }