Beispiel #1
0
        public void DropItem(BaseObject attack)
        {
            //计算爆的值
            uint ownerid = attack.GetTypeId();

            if (attack.type == OBJECTTYPE.EUDEMON)
            {
                if ((attack as EudemonObject).GetOwnerPlay() != null)
                {
                    ownerid = (attack as EudemonObject).GetOwnerPlay().GetTypeId();
                }
            }
            byte droptype = BattleSystem.AdjustDrop(attack, this);

            if (droptype == BattleSystem.EXPLODE_ITEM_CHANCE1)
            {
                return;
            }
            GameStruct.DropItemInfo info = ConfigManager.Instance().GetDropItemInfo(mInfo.drop_group);
            if (info == null)
            {
                return;
            }
            int num = 0;

            switch (droptype)
            {
            case BattleSystem.EXPLODE_ITEM_CHANCE2:
            {
                num = IRandom.Random(2, 5);
                break;
            }

            case BattleSystem.EXPLODE_ITEM_CHANCE3:
            {
                num = IRandom.Random(6, 9);
                break;
            }

            case BattleSystem.EXPLODE_ITEM_CHANCE4:
            {
                num = IRandom.Random(10, 15);
                break;
            }
            }
            //如果不是百分之百的爆率..爆不出那么多的啦
            int   nCurnum = 0;
            short x       = 0;
            short y       = 0;

            //要爆的数量
            for (int i = 0; i < num; i++)
            {
                int nNum = IRandom.Random(0, info.listamount.Count);
                for (int j = 0; j < nNum; j++)
                {
                    int index = IRandom.Random(0, info.listamount.Count);
                    if (IRandom.Random(1, 100) < info.listrate[index])
                    {
                        this.GetDropItemPoint(ref x, ref y);
                        DropItemClass dropclass = info.listitem[index];
                        if (dropclass.list_itemid.Count == 1)
                        {
                            this.GetGameMap().AddDropItemObj(dropclass.list_itemid[0], x, y, ownerid);
                        }
                        else
                        {
                            continue; //掉落的道具组多个道具在下面的函数掉落。
                        }
                        //else
                        //{
                        //    this.GetGameMap().AddDropItemObj(dropclass.list_itemid[IRandom.Random(0,dropclass.list_itemid.Count - 1)], x, y, attack.GetTypeId());
                        //}

                        nCurnum++;
                        if (nCurnum == num)
                        {
                            break;
                        }
                    }
                }
            }
            //必掉的道具
            for (int i = 0; i < info.listitem.Count; i++)
            {
                DropItemClass dropclass = info.listitem[i];
                if (dropclass.list_itemid.Count > 1)
                {
                    for (int j = 0; j < info.listamount[i]; j++)
                    {
                        if (IRandom.Random(1, 100) < info.listrate[i])
                        {
                            this.GetDropItemPoint(ref x, ref y);
                            this.GetGameMap().AddDropItemObj(dropclass.list_itemid[IRandom.Random(0, dropclass.list_itemid.Count - 1)], x, y, ownerid);
                        }
                    }
                }
            }
        }
Beispiel #2
0
        public override bool Run()
        {
            bool ret = base.Run();

            //距离超出-
            if (!this.GetPoint().CheckVisualDistance(mPlay.GetCurrentX(), mPlay.GetCurrentY(), DIS))
            {
                mPlay.GetTimerSystem().DeleteStatus(GameStruct.RoleStatus.STATUS_MINGGUOSHENGNV);
                return(false);
            }
            //刷新周围对象以便寻找目标
            if (this.GetAi().GetTargetObject() == null)
            {
                if (System.Environment.TickCount - mnRefreshTick > REFRESHTIME)
                {
                    this.RefreshVisibleObject();
                    mnRefreshTick = System.Environment.TickCount;
                }
            }
            if (mMagicAttackTime.ToNextTime())
            {
                this.RefreshVisibleObject();

                NetMsg.MsgMonsterMagicInjuredInfo magicattack = new NetMsg.MsgMonsterMagicInjuredInfo();
                magicattack.roleid  = this.GetTypeId();
                magicattack.role_x  = this.GetCurrentX();
                magicattack.role_y  = this.GetCurrentY();
                magicattack.tag     = 21;
                magicattack.magicid = 6051;
                magicattack.magiclv = 0;
                this.BrocatBuffer(magicattack.GetBuffer());



                NetMsg.MsgGroupMagicAttackInfo magicattackex = new NetMsg.MsgGroupMagicAttackInfo();
                magicattackex.nID      = this.GetTypeId();
                magicattackex.nX       = this.GetCurrentX();
                magicattackex.nY       = this.GetCurrentY();
                magicattackex.nMagicID = 6051;
                magicattackex.nMagicLv = 0;
                magicattackex.bDir     = this.GetDir();
                foreach (RefreshObject refobj in this.GetVisibleList().Values)
                {
                    //只攻击怪物
                    if (refobj.obj.type == OBJECTTYPE.MONSTER)
                    {
                        BaseObject obj = refobj.obj;
                        if (this.GetPoint().CheckVisualDistance(obj.GetCurrentX(), obj.GetCurrentY(), 10))
                        {
                            uint injured = BattleSystem.AdjustDamage(mPlay, obj, true);
                            NetMsg.MsgAttackInfo info = new NetMsg.MsgAttackInfo();
                            info.tag = 21;
                            obj.Injured(this, injured, info);
                            magicattackex.AddObject(obj.GetTypeId(), (int)injured);
                        }
                    }
                }
                this.BrocatBuffer(magicattackex.GetBuffer());
            }
            return(ret);
        }