/// <summary> /// 是否可以执行选项 /// </summary> /// <param name="magicHelperItem"></param> /// <returns></returns> private bool CanExecuteItem(Dictionary <MagicActionIDs, GridMagicHelperItem> dict, GridMagicHelperItem magicHelperItem, double effectSecs, int maxNum) { long nowTicks = TimeUtil.NOW(); long ticks = magicHelperItem.StartedTicks + (long)(effectSecs * 1000); if (maxNum <= 0) { //判断是否超过了时间 if (nowTicks >= ticks) { lock (dict) { dict.Remove(magicHelperItem.MagicActionID); } return(false); } else { //System.Diagnostics.Debug.WriteLine("CanExecuteItem, {0}", nowTicks - ticks); return(true); } } //判断是否超过了次数 if (magicHelperItem.ExecutedNum >= maxNum) { lock (dict) { dict.Remove(magicHelperItem.MagicActionID); } return(false); } long ticksSlot = (long)((effectSecs / maxNum) * 1000); //判断是否超过了时间 if (nowTicks - magicHelperItem.LastTicks < ticksSlot) { return(false); } return(true); }
/// </summary> public void ExecuteMUFireWall(int id, string gridXY, Dictionary <MagicActionIDs, GridMagicHelperItem> dict) { string[] fields = gridXY.Split('_'); int gridX = Global.SafeConvertToInt32(fields[0]); int gridY = Global.SafeConvertToInt32(fields[1]); GridMagicHelperItem magicHelperItem = null; lock (dict) { dict.TryGetValue((MagicActionIDs)id, out magicHelperItem); } if (null == magicHelperItem) { return; } if (!CanExecuteItem(dict, magicHelperItem, (int)magicHelperItem.MagicActionParams[0], (int)magicHelperItem.MagicActionParams[1])) { return; } magicHelperItem.ExecutedNum++; magicHelperItem.LastTicks = TimeUtil.NOW(); //执行伤害 //根据敌人ID判断对方是系统爆的怪还是其他玩家 int addValue = (int)magicHelperItem.MagicActionParams[2]; int attacker = (int)magicHelperItem.MagicActionParams[3]; double baseRate = magicHelperItem.MagicActionParams[4]; if (-1 != attacker) { GameClient client = GameManager.ClientMgr.FindClient(attacker); if (null != client) { List <Object> enemiesList = new List <object>(); GameManager.ClientMgr.LookupEnemiesAtGridXY(client, gridX, gridY, enemiesList); GameManager.MonsterMgr.LookupEnemiesAtGridXY(client, gridX, gridY, enemiesList); BiaoCheManager.LookupEnemiesAtGridXY(client, gridX, gridY, enemiesList); JunQiManager.LookupEnemiesAtGridXY(client, gridX, gridY, enemiesList); for (int x = 0; x < enemiesList.Count; x++) { IObject obj = enemiesList[x] as IObject; if (obj.CurrentCopyMapID != client.CurrentCopyMapID) { continue; } if (obj is GameClient) //被攻击者是角色 { if ((obj as GameClient).ClientData.RoleID != attacker && Global.IsOpposition(client, (obj as GameClient))) { GameManager.ClientMgr.NotifyOtherInjured(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, client, obj as GameClient, 0, 0, 1.0, 1, false, 0, 1.0, 0, 0, 0, 0.0, 0.0, false, false, baseRate, addValue); } } else if (obj is Monster) //被攻击者是怪物 { if (Global.IsOpposition(client, (obj as Monster))) { GameManager.MonsterMgr.NotifyInjured(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, client, obj as Monster, 0, 0, 1.0, 1, false, 0, 1.0, 0, 0, 0, 0.0, 0.0, false, baseRate, addValue); } } else if (obj is BiaoCheItem) //被攻击者是镖车 { if (Global.IsOpposition(client, (obj as BiaoCheItem))) { BiaoCheManager.NotifyInjured(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, client, obj as BiaoCheItem, 0, 0, 1.0, 1, false, 0, 1.0, 0, 0, baseRate, addValue); } } else if (obj is JunQiItem) //被攻击者是帮旗 { if (Global.IsOpposition(client, (obj as JunQiItem))) { JunQiManager.NotifyInjured(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, client, obj as JunQiItem, 0, 0, 1.0, 1, false, 0, 0, 0, 0, baseRate, addValue); } } else if (obj is FakeRoleItem) //被攻击者是假人 { if (Global.IsOpposition(client, (obj as FakeRoleItem))) { FakeRoleManager.NotifyInjured(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, client, obj as FakeRoleItem, 0, 0, 1.0, 1, false, 0, baseRate, addValue, 0); } } } } else { Monster monster = GameManager.MonsterMgr.FindMonster(magicHelperItem.MapCode, attacker); if (null != monster) { List <Object> enemiesList = new List <object>(); GameManager.ClientMgr.LookupEnemiesAtGridXY(monster, gridX, gridY, enemiesList); GameManager.MonsterMgr.LookupEnemiesAtGridXY(monster, gridX, gridY, enemiesList); BiaoCheManager.LookupEnemiesAtGridXY(monster, gridX, gridY, enemiesList); JunQiManager.LookupEnemiesAtGridXY(monster, gridX, gridY, enemiesList); for (int x = 0; x < enemiesList.Count; x++) { IObject obj = enemiesList[x] as IObject; if (obj.CurrentCopyMapID != monster.CurrentCopyMapID) { continue; } if (obj is GameClient) //被攻击者是角色 { if ((obj as GameClient).ClientData.RoleID != attacker && Global.IsOpposition(monster, (obj as GameClient))) { GameManager.ClientMgr.NotifyOtherInjured(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, monster, obj as GameClient, 0, 0, 1.0, 1, false, 0, 1.0, 0, 0, 0, 0.0, 0.0, false, baseRate, addValue); } } else if (obj is Monster) //被攻击者是怪物 { if (Global.IsOpposition(monster, (obj as Monster))) { GameManager.MonsterMgr.Monster_NotifyInjured(Global._TCPManager.MySocketListener, Global._TCPManager.TcpOutPacketPool, monster, obj as Monster, 0, 0, 1.0, 1, false, 0, 1.0, 0, 0, 0, 0.0, 0.0, false, baseRate, addValue); } } } } } } }
/// <summary> /// 添加技能辅助项 /// </summary> /// <param name="magicActionID"></param> /// <param name="magicActionParams"></param> public void AddMagicHelper(MagicActionIDs magicActionID, double[] magicActionParams, int mapCode, Point centerGridXY, int gridWidthNum, int gridHeightNum, int copyMapID = -1) { if (copyMapID < 0) { copyMapID = -1; } GameMap gameMap = GameManager.MapMgr.DictMaps[mapCode]; List <Point> pts = new List <Point>(); pts.Add(centerGridXY); for (int i = (int)centerGridXY.X - gridWidthNum; i <= centerGridXY.X + gridWidthNum; i++) { for (int j = (int)centerGridXY.Y - gridHeightNum; j <= centerGridXY.Y + gridHeightNum; j++) { pts.Add(new Point(i, j)); } } for (int i = 0; i < pts.Count; i++) { ///障碍上边,不能放火墙 if (Global.InOnlyObs(ObjectTypes.OT_CLIENT, mapCode, (int)pts[i].X, (int)pts[i].Y)) { continue; } Dictionary <MagicActionIDs, GridMagicHelperItem> dict = null; string key = string.Format("{0}_{1}_{2}", pts[i].X, pts[i].Y, copyMapID); lock (_GridMagicHelperDict) { if (!_GridMagicHelperDict.TryGetValue(key, out dict)) { dict = new Dictionary <MagicActionIDs, GridMagicHelperItem>(); _GridMagicHelperDict[key] = dict; } } lock (dict) { if (dict.ContainsKey(magicActionID)) //一个格子上边,同时只能有一个buffer { continue; } } GridMagicHelperItem magicHelperItem = new GridMagicHelperItem() { MagicActionID = magicActionID, MagicActionParams = magicActionParams, StartedTicks = TimeUtil.NOW(), LastTicks = TimeUtil.NOW(), ExecutedNum = 0, MapCode = mapCode, }; lock (dict) { dict[magicHelperItem.MagicActionID] = magicHelperItem; } } }