コード例 #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());
            }
        }
コード例 #2
0
        /// <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);
        }
コード例 #3
0
        /// <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);
        }
コード例 #4
0
        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);
            }
        }
コード例 #5
0
    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);
        }
    }
コード例 #6
0
        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());
        }
コード例 #7
0
        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);
        }
コード例 #8
0
        public async Task Delete(ItemDropEntity entity)
        {
            await _itemDropRepository.Remove(entity);

            await _bus.RaiseEvent(new EntityDeletedEvent <ItemDropEntity>(entity)).ConfigureAwait(false);
        }
コード例 #9
0
 public async Task Add(ItemDropEntity entity)
 {
     await _itemDropRepository.Add(entity);
 }