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