//刷新可视对象列表 public virtual void RefreshVisibleObject() { //在地图被销毁的怪物啊-- 掉落物品啊..刷新的时候找不到了就删除掉! uint id = 0; List <uint> templist = null; foreach (RefreshObject refobj in mVisibleList.Values) { BaseObject obj = refobj.obj; if (obj.type == OBJECTTYPE.MONSTER || obj.type == OBJECTTYPE.GUARDKNIGHT) { id = obj.GetTypeId(); } else { id = obj.GetGameID(); } if (GetGameMap().GetObject(id) == null) { if (templist == null) { templist = new List <uint>(); } templist.Add(id); } } if (templist != null) { for (int i = 0; i < templist.Count; i++) { mVisibleList.Remove(templist[i]); } } }
protected override void ProcessAction_Die(GameStruct.Action act) { PlayerObject play = act.GetObject(0) as PlayerObject; BaseObject baseobj = act.GetObject(0) as BaseObject; if (play == null && baseobj.type == OBJECTTYPE.EUDEMON) { play = (baseobj as EudemonObject).GetOwnerPlay(); } //根据打出的伤害获得经验值 uint injured = (uint)act.GetObject(1); NetMsg.MsgMonsterDieInfo info = new NetMsg.MsgMonsterDieInfo(); info.roleid = baseobj.GetTypeId(); info.role_x = baseobj.GetCurrentX(); info.role_y = baseobj.GetCurrentY(); info.injuredvalue = 0; info.monsterid = this.GetTypeId(); byte[] msg = info.GetBuffer(); //掉落道具 this.DropItem(baseobj); //RefreshVisibleObject(); //if (mRefreshList.Count > 0) //{ // this.GetGameMap().BroadcastBuffer(this,msg); // //掉落道具 // this.DropItem(play); //} this.BrocatBuffer(msg); LastDieTime = System.Environment.TickCount; if (play == null && baseobj.type != OBJECTTYPE.EUDEMON) { return; } //计算经验 play.AddExp((int)injured, play.GetLevel(), this.GetLevel()); //死亡的幻兽加灵气值复活 play.GetEudemonSystem().Eudemon_Alive(this); this.GetAi().Die(); this.GetAi().SetAttackTarget(null); mAliveTime.Update(); //执行死亡脚本- 最后一击的击杀者执行该脚本 if (mInfo.die_scripte_id > 0 && play != null) { ScripteManager.Instance().ExecuteAction(mInfo.die_scripte_id, play); } }
public override bool Run() { base.Run(); if (System.Environment.TickCount - mnTick > mnTime) { this.ClearThis(); return(false); } //会攻击的特效-- 降灵咒雨 if (mnEffID == Define.JIANGLINGZHOUYU) { if (System.Environment.TickCount - mnAttackTick > 1000) { mnAttackTick = System.Environment.TickCount; NetMsg.MsgMonsterMagicInjuredInfo magicattack = new NetMsg.MsgMonsterMagicInjuredInfo(); magicattack.roleid = (uint)mnEffID; magicattack.role_x = this.GetCurrentX(); magicattack.role_y = this.GetCurrentY(); magicattack.tag = 21; magicattack.magicid = (ushort)Define.JIANGLINGZHOUYU_MAGICID; magicattack.magiclv = 0; this.BrocatBuffer(magicattack.GetBuffer()); NetMsg.MsgGroupMagicAttackInfo magicattackex = new NetMsg.MsgGroupMagicAttackInfo(); magicattackex.nID = mPlay.GetTypeId(); magicattackex.nX = this.GetCurrentX(); magicattackex.nY = this.GetCurrentY(); magicattackex.nMagicID = (ushort)Define.JIANGLINGZHOUYU_MAGICID; magicattackex.nMagicLv = 0; magicattackex.bDir = this.GetDir(); NetMsg.MsgAttackInfo info = new NetMsg.MsgAttackInfo(); info.tag = 21; //---攻击 暂时只攻击怪物 foreach (RefreshObject refobj in this.GetVisibleList().Values) { BaseObject obj = refobj.obj; if (obj.type == OBJECTTYPE.MONSTER) { if (this.GetPoint().CheckVisualDistance(obj.GetCurrentX(), obj.GetCurrentY(), Define.JIANGLINGZHOUYU_DIS)) { uint nValue = BattleSystem.AdjustDamage(mPlay, obj, true); magicattackex.AddObject(obj.GetTypeId(), (int)nValue); obj.Injured(mPlay, nValue, info); } } } this.BrocatBuffer(magicattackex.GetBuffer()); } } return(true); }
public override bool CanPK(BaseObject obj, bool bGoCrime = true) { bool ret = base.CanPK(obj); if (ret) { //不攻击主人 if (obj.type == OBJECTTYPE.PLAYER) { if (obj.GetTypeId() == mPlay.GetTypeId()) { return false; } } } return ret; // return base.CheckIsAttack(obj); }
public override bool CanPK(BaseObject obj, bool bGoCrime = true) { bool ret = base.CanPK(obj); if (ret) { //不攻击主人 if (obj.type == OBJECTTYPE.PLAYER) { if (obj.GetTypeId() == mPlay.GetTypeId()) { return(false); } } } return(ret); // return base.CheckIsAttack(obj); }
//删除地图对象 public void RemoveObj(BaseObject obj) { uint id; if (obj.type == OBJECTTYPE.MONSTER) { id = obj.GetTypeId(); } else { id = obj.GetGameID(); } if (mDicObject.ContainsKey(id)) { if (obj.type == OBJECTTYPE.PLAYER) { PlayerObject play = obj as PlayerObject; play.ClearThis(); //广播删除自己 } if (obj.type == OBJECTTYPE.EUDEMON) { EudemonObject eudemon = obj as EudemonObject; eudemon.ReCall(); } if (obj.type == OBJECTTYPE.PTICH) { PtichObject ptich = obj as PtichObject; ptich.ClearThis(); } //加到临时删除列表- 下次process时处理删除 mListDeleteObj.Add(obj); // mDicObject.Remove(id); } if (this.GetObjectCount(OBJECTTYPE.PLAYER) == 0) { last_null_tick = System.Environment.TickCount; } }
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 void Process() { if (mDicObject.Count == 0 && mListDeleteObj.Count == 0 && mListAddObj.Count == 0) { return; //地图没人..就不处理了 } //删除离开地图的玩家 if (mListDeleteObj.Count > 0) { uint id; for (int i = 0; i < mListDeleteObj.Count; i++) { BaseObject obj = mListDeleteObj[i] as BaseObject; if (obj.type == OBJECTTYPE.MONSTER || obj.type == OBJECTTYPE.GUARDKNIGHT) { id = obj.GetTypeId(); } else { id = obj.GetGameID(); } //obj.Dispose(); //if (obj.type == OBJECTTYPE.PLAYER) //{ // UserEngine.Instance().RemovePlayObject(obj as PlayerObject); //} if (mDicObject.ContainsKey(id)) { mDicObject.Remove(id); } } mListDeleteObj.Clear(); } //要添加的对象 if (mListAddObj.Count > 0) { for (int i = 0; i < mListAddObj.Count; i++) { BaseObject obj = mListAddObj[i]; if (obj.type == OBJECTTYPE.MONSTER) //怪物是以typeid为主键 { mDicObject[obj.GetTypeId()] = obj; } else { mDicObject[obj.GetGameID()] = obj; } } mListAddObj.Clear(); } //地图所有对象run //需要拷贝一份词典,因为在循环里面会改变该词典的集合-- //需要优化 这里效率太低了 // Dictionary<uint, BaseObject> tempdic = new Dictionary<uint, BaseObject>(mDicObject); //2015.11.12 已解决,声明了一个删除的列表- mListDeleteObj 在removeobj后加入到列表 process再进行删除-内存不涨了 好开心o(∩_∩)o 哈哈 foreach (BaseObject obj in mDicObject.Values) { if (!obj.Run()) { mListDeleteObj.Add(obj); } } }
//删除地图对象 public void RemoveObj(BaseObject obj) { uint id ; if(obj.type == OBJECTTYPE.MONSTER) id = obj.GetTypeId(); else id =obj.GetGameID(); if ( mDicObject.ContainsKey(id)) { if (obj.type == OBJECTTYPE.PLAYER) { PlayerObject play = obj as PlayerObject; play.ClearThis(); //广播删除自己 } if (obj.type == OBJECTTYPE.EUDEMON) { EudemonObject eudemon = obj as EudemonObject; eudemon.ReCall(); } if (obj.type == OBJECTTYPE.PTICH) { PtichObject ptich = obj as PtichObject; ptich.ClearThis(); } //加到临时删除列表- 下次process时处理删除 mListDeleteObj.Add(obj); // mDicObject.Remove(id); } if (this.GetObjectCount(OBJECTTYPE.PLAYER) == 0) { last_null_tick = System.Environment.TickCount; } }
//连击技能 private void ComboMagic(NetMsg.MsgAttackInfo info, BaseObject target) { byte[] msg = null; ushort magiclv = play.GetMagicSystem().GetMagicLevel(info.skillid); GameStruct.MagicTypeInfo baseinfo = ConfigManager.Instance().GetMagicTypeInfo(info.usType); //施法动作 NetMsg.MsgMonsterMagicInjuredInfo magicinfo = new NetMsg.MsgMonsterMagicInjuredInfo(); magicinfo.roleid = play.GetTypeId(); magicinfo.role_x = play.GetCurrentX(); magicinfo.role_y = play.GetCurrentY(); magicinfo.injuredvalue = 0; magicinfo.monsterid = play.GetTypeId(); magicinfo.tag = 21; magicinfo.magicid = (ushort)info.usType; magicinfo.magiclv = magiclv; msg = magicinfo.GetBuffer(); play.BroadcastBuffer(msg); //play.GetGameMap().BroadcastBuffer(play, msg); int _locktime = ConfigManager.Instance().GetTrackTime(baseinfo.track_id); int _target_locktime = ConfigManager.Instance().GetTrackTime(baseinfo.track_id2); int trackcount = ConfigManager.Instance().GetTrackNumber(baseinfo.track_id); //锁定自己与目标 play.Lock(_locktime); target.Lock(_target_locktime, target.type == OBJECTTYPE.PLAYER); //计算伤害值 NetMsg.MsgMagicAttackInfo magicattack ; for (int i = 0; i < trackcount; i++) { ////如果是影轮回,就有几率穿透伤害 //magicattack = new NetMsg.MsgMagicAttackInfo(); //magicattack.id = play.GetTypeId(); //magicattack.value = 0; //magicattack.magicid = (ushort)GameStruct.MagicTypeInfo.ZHENSHIDAJI; //magicattack.level = magiclv; //magicattack.targetid = target.GetTypeId(); //msg = magicattack.GetBuffer(); //play.BroadcastBuffer(msg, true); // target.Injured(play, injured, info); //优先攻击合体的幻兽 uint target_id = target.GetTypeId(); if (target.type == OBJECTTYPE.PLAYER) { EudemonObject eudemon_obj = (target as PlayerObject).GetEudemonSystem().GetInjuredEudemon(); if (eudemon_obj != null) { target_id = eudemon_obj.GetTypeId(); } } magicattack = new NetMsg.MsgMagicAttackInfo(); magicattack.id = play.GetTypeId(); uint injured = BattleSystem.AdjustDamage(play, target); magicattack.value = injured; magicattack.magicid = (ushort)info.usType; magicattack.level = magiclv; magicattack.targetid = target_id; msg = magicattack.GetBuffer(); play.BroadcastBuffer(msg, true); target.Injured(play, injured, info); } if (baseinfo.track_id > 0) { //取得攻击方向 byte attackdir = GameStruct.DIR.GetDirByPos(play.GetCurrentX(), play.GetCurrentY(), target.GetCurrentX(), target.GetCurrentY()); play.SetDir(attackdir); target.SetDir(attackdir); NetMsg.MsgCombo combo = new NetMsg.MsgCombo(); combo.CalcTag(info.usType, play, target); short x = 0; short y = 0; GameStruct.TrackInfo trackinfo = ConfigManager.Instance().GetTrackInfo(baseinfo.track_id); GameStruct.TrackInfo track2 = ConfigManager.Instance().GetTrackInfo(baseinfo.track_id2); for (int i = 0; i < trackcount; i++) { //怪物 if (track2.step > 0) { if (GameStruct.DIR.GetNexPoint(target, ref x, ref y)) { target.SetPoint(x, y); } } //角色 if (trackinfo.step > 0) { for (int j = 0; j < trackinfo.step;j++ ) { if (GameStruct.DIR.GetNexPoint(play, ref x, ref y)) { play.SetPoint(x, y); } } } combo.AddComboInfo(info.usType, play, target, trackinfo.action, track2.action); trackinfo = ConfigManager.Instance().GetTrackInfo(trackinfo.id_next); if (track2.id_next != 0) { track2 = ConfigManager.Instance().GetTrackInfo(track2.id_next); } } msg = combo.GetBuffer(); play.BroadcastBuffer(msg, true); } }
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); }
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); } } } } }