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()); } }
/// <summary> /// Converts the domain model into an entity. /// </summary> /// <returns>The entity.</returns> /// <param name="itemDrop">ItemDrop.</param> internal static ItemDropEntity ToEntity(this ItemDrop itemDrop) { ItemDropEntity itemDropEntity = new ItemDropEntity { ItemId = itemDrop.ItemId, Amount = itemDrop.Amount, Weight = itemDrop.Weight }; return(itemDropEntity); }
/// <summary> /// Converts the entity into a domain model. /// </summary> /// <returns>The domain model.</returns> /// <param name="itemDropEntity">ItemDrop entity.</param> internal static ItemDrop ToDomainModel(this ItemDropEntity itemDropEntity) { ItemDrop itemDrop = new ItemDrop { ItemId = itemDropEntity.ItemId, Amount = itemDropEntity.Amount, Weight = itemDropEntity.Weight }; return(itemDrop); }
public override void use(WorldBase world, Vector2 location, Entity user) { world.killEntity(this); Random rand = new Random(); foreach (Item item in items) { ItemDropEntity drop = new ItemDropEntity(location, world, item); drop.velocity += new Vector2(rand.Next(1) - 2, -rand.Next(10)); world.addEntity(drop); } }
public override void Killed(BaseCharacterEntity lastAttacker) { base.Killed(lastAttacker); deadTime = Time.unscaledTime; var maxHp = this.GetStats().hp; var randomedExp = Random.Range(MonsterDatabase.randomExpMin, MonsterDatabase.randomExpMax); var randomedGold = Random.Range(MonsterDatabase.randomGoldMin, MonsterDatabase.randomGoldMax); if (receivedDamageRecords.Count > 0) { var enemies = new List <BaseCharacterEntity>(receivedDamageRecords.Keys); foreach (var enemy in enemies) { var receivedDamageRecord = receivedDamageRecords[enemy]; var rewardRate = receivedDamageRecord.totalReceivedDamage / maxHp; if (rewardRate > 1) { rewardRate = 1; } enemy.IncreaseExp((int)(randomedExp * rewardRate)); if (enemy is PlayerCharacterEntity) { var enemyPlayer = enemy as PlayerCharacterEntity; enemyPlayer.IncreaseGold((int)(randomedGold * rewardRate)); } } } receivedDamageRecords.Clear(); foreach (var randomItem in MonsterDatabase.randomItems) { if (Random.value <= randomItem.dropRate) { var item = randomItem.item; var amount = randomItem.amount; if (item != null && GameInstance.Items.ContainsKey(item.HashId)) { var itemDataId = item.HashId; if (amount > item.maxStack) { amount = item.maxStack; } ItemDropEntity.DropItem(this, itemDataId, 1, amount); } } } var lastPlayer = lastAttacker as PlayerCharacterEntity; if (lastPlayer != null) { lastPlayer.OnKillMonster(this); } }
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()); }
public override int use(PlayerBase user, WorldBase world, Vector2 location, GameTime time, BinaryInputManager inputManager) { if (inputManager.isDown()) { TileType selectedBlock = user.world.getBlock(user.location); TileType belowBlock = user.world.getBlock(location); if (selectedBlock != null && (selectedBlock.TILEID == TileTypeReferencer.REACTIVE_BUSH_0.TILEID || selectedBlock.TILEID == TileTypeReferencer.REACTIVE_BUSH_0.TILEID)) { if (!inputManager.wasDown() || !user.world.worldLocToTileLoc(user.location).Equals(harvestLocation)) { harvestLocation = user.world.worldLocToTileLoc(user.location); ticksHarvesting = 0; maxTicksHarvestingTime = selectedBlock.harvestTicks; } if (selectedBlock.tags.Contains(TagReferencer.Harvest)) { if (ticksHarvesting == 0) { SoundManager.getSound(selectedBlock.blockBreakSound).playWithVariance(0, .05f, 0, SoundType.MONSTER); } ticksHarvesting++; if (ticksHarvesting > selectedBlock.harvestTicks - 1) { //user.world.useBlock(user.location, user, this); user.world.placeTile(TileTypeReferencer.AIR, user.location); ItemDropEntity dropper = new ItemDropEntity(user.location, world, new Item_Spud(1)); Random random = new Random(); dropper.velocity += new Vector2(random.Next(1) - 2, -random.Next(10)); world.addEntity(dropper); ticksHarvesting = 0; for (int i = 0; i < 7; i++) { world.addEntity(new ParticleTileBreak(user.location, world, new Vector2(), selectedBlock, 150)); } } } } else if (location.Y > user.location.Y + Chunk.tileDrawWidth / 2 && belowBlock != null && belowBlock.tags.Contains(TagReferencer.SOLID)) { if (!inputManager.wasDown() || !user.world.worldLocToTileLoc(location).Equals(harvestLocation)) { harvestLocation = user.world.worldLocToTileLoc(location); ticksHarvesting = 0; maxTicksHarvestingTime = belowBlock.harvestTicks; } if (ticksHarvesting == 0) { SoundManager.getSound(belowBlock.blockBreakSound).playWithVariance(0, .05f, 0, SoundType.MONSTER); } ticksHarvesting++; if (ticksHarvesting > belowBlock.harvestTicks - 1) { user.world.placeTile(TileTypeReferencer.AIR, location); ticksHarvesting = 0; for (int i = 0; i < 7; i++) { world.addEntity(new ParticleTileBreak(location, world, new Vector2(), belowBlock, 150)); } return(1); } } else { ticksHarvesting = 0; } } else { ticksHarvesting = 0; } return(0); }
public async Task Delete(ItemDropEntity entity) { await _itemDropRepository.Remove(entity); await _bus.RaiseEvent(new EntityDeletedEvent <ItemDropEntity>(entity)).ConfigureAwait(false); }
public async Task Add(ItemDropEntity entity) { await _itemDropRepository.Add(entity); }