using System.Xml; using System.Collections; using System.Collections.Generic; using UnityEngine; public class Map { public const float TILE_WIDTH = 1f; public const float TILE_LENGTH = 1f; public MapData.MapID id; public bool isEditing; private int _columns; private int _rows; private string _name; private Dictionary battleObjectDict; private Dictionary crystalDict; private List crystalList; private Dictionary doorDict; private List doorList; private Dictionary itemDict; private List itemList; private Dictionary itemPosDict; private List itemPosList; private Dictionary flagDict; private Dictionary flagBaseDict; private Dictionary startPosDict; private Dictionary uavDict; private List teamBlockList; private List blockList; private XmlNode mapNode; public Map() { battleObjectDict = new Dictionary(); crystalDict = new Dictionary(); crystalList = new List(); doorDict = new Dictionary(); doorList = new List(); itemDict = new Dictionary(); itemList = new List(); itemPosDict = new Dictionary(); itemPosList = new List(); flagDict = new Dictionary(); flagBaseDict = new Dictionary(); startPosDict = new Dictionary(); uavDict = new Dictionary (); teamBlockList = new List(); blockList = new List(); } public static int XToColumn(float x) { return (int)(x/TILE_WIDTH); } public static int ZToRow(float z) { return (int)(z/TILE_LENGTH); } public static float GetCenterX(int col) { return col*TILE_WIDTH+TILE_WIDTH/2f; } public static float GetCenterZ(int row) { return row*TILE_WIDTH+TILE_LENGTH/2f; } public int GetIndexByGrid(int col, int row) { if(!IsInRange(col, row)) return -1; return row * columns + col; } public Vector2 GetGridByIndex(int index) { int col = index % rows; int row = index / columns; return new Vector2(col, row); } public bool IsInRange(int col, int row) { if(col < 0 || col >= columns || row < 0 || row >= rows) return false; return true; } public string name { get{return _name;} } public int columns { get{return _columns;} } public int rows { get{return _rows;} } public void CreateMap() { CreateBlock(); CreateBuilding(); } private void CreateBlock() { Block[] blockArr = GameObject.FindObjectsOfType (); for(int i=0; i (); for(int i=0; i (); for(int i=0; i (); for(int i=0; i (); for(int i=0; i (); for(int i=0; i list = new List(); for(int i=0; i= 0 && crystalBase.GetStation() != null && crystalBase.GetStation().team == player.team) { Player.Hero hero = player.GetHero(); if(hero.IsFirstTimeSelectHero()) { if(crystalBase.isStart > 0) list.Add(crystalBase); } else { float d = NumberUtil.distanceVector3(crystalBase.position, hero.deadPostion); if(d < distance) { distance = d; pos = crystalBase.position; list.Clear(); list.Add(crystalBase); } else if(d == distance+5f) { list.Add(crystalBase); } } } } // if(player.IsFirstTimeSelectHero() && flagBaseDict.ContainsKey(player.team)) // { // list.Add(flagBaseDict[player.team]); // } if(list.Count > 0) { int i = Random.Range(0, list.Count); return list[i].GetStartPosition(); } else if(flagBaseDict.ContainsKey(player.team)) { return flagBaseDict[player.team].GetStartPosition(); } return Vector3.zero; } public CrystalBase GetCrystalBase(int id) { if(crystalDict.ContainsKey(id)) return crystalDict [id]; return null; } public List GetCrystalBaseList() { return crystalList; } public CrystalBase GetInRangeCrystalBase(Vector3 pos) { for(int i=0; i(); station.Init(this); station.id = data.id; station.userId = data.userId; station.team = data.team; station.typeId = MapObjectUtil.TypeId.Station.GetHashCode(); station.aiType = AI.AIType.Station; station.position = crystalBase.position; crystalBase.SetStation(station); AddBattleObject (station); stationObj.AddComponent().init(battleController); return station; } public void ClearBlocks(TeamUtil.Team team) { if(blockList.Count > 0) { for(int i=blockList.Count-1; i>=0; i--) { Block block = blockList[i]; if(true || block.team == team) { block.Remove(); blockList.RemoveAt(i); } } } } public Door GetDoorByIndex(int index) { if(doorDict.ContainsKey(index)) return doorDict[index]; return null; } public List GetDoorList() { return doorList; } public void RemoveDoor(Door door) { doorDict.Remove(door.id); doorList.Remove(door); CheckDoorRemove(); } public void RemoveNoIdDoor() { foreach(KeyValuePair kvp in doorDict) { if(kvp.Value.id == 0) { doorDict.Remove(kvp.Key); doorList.Remove(kvp.Value); GameObject.Destroy(kvp.Value.gameObject); } } CheckDoorRemove(); } private void CheckDoorRemove() { int blueCount = 0; int redCount = 0; for(int i=0; i GetMapItemPosList() { return itemPosList; } public MapItem CreateMapItem(MapItemData data) { if(itemDict.ContainsKey(data.id)) { return itemDict [data.id]; } GameObject mapItemObj = GameObject.Instantiate(Resources.Load(Config.BIGGER_ITEM_PREFAB)); MapItem mapItem = mapItemObj.GetComponent(); mapItem.Init(this); mapItem.id = data.id; mapItem.team = data.team; mapItem.SetPosition(data.postion); itemDict.Add(mapItem.id, mapItem); itemList.Add(mapItem); return mapItem; } public MapItem GetMapItem(int id) { if(itemDict.ContainsKey(id)) return itemDict[id]; return null; } public List GetMapItemByRange(Vector3 originPos, float distance) { List list = new List(); for(int i=0; i GetMapItemList() { return itemList; } public void RemoveMapItem(MapItem mapItem) { if(mapItem != null) { itemDict.Remove(mapItem.id); itemList.Remove(mapItem); if(itemPosDict.ContainsKey(mapItem.id)) itemPosDict[mapItem.id].item = null; } } public void ClearAllMapItem() { for(int i=itemList.Count-1; i>=0; i--) { itemList[i].Remove(); } } public StartPos GetStartPos(TeamUtil.Team team) { if(startPosDict.ContainsKey(team)) return startPosDict[team]; return null; } public FlagBase GetFlagBase(TeamUtil.Team team) { return flagBaseDict[team]; } public FlagItem CreateFlag(TeamUtil.Team team) { GameObject flagObj = GameObject.Instantiate(Resources.Load(Config.FLAG_PREFAB)); FlagItem flagItem = flagObj.GetComponent(); flagItem.Init(this); flagItem.team = team; RemoveFlag(team); flagDict.Add(team, flagItem); return flagItem; } public FlagItem GetFlag(TeamUtil.Team team) { if(flagDict.ContainsKey(team)) return flagDict[team]; return null; } public bool HasFlag() { return flagDict.Count > 0; } public FlagItem RemoveFlag(TeamUtil.Team team) { FlagItem flag = GetFlag(team); flagDict.Remove(team); if(flag != null) { flag.Remove(); } return flag; } public void CleanFlag() { // how to remove the Map objects RemoveFlag(TeamUtil.Team.Blue); RemoveFlag(TeamUtil.Team.Red); } public Dictionary GetBattleObjectDict() { return battleObjectDict; } public BattleObject AddBattleObject(BattleObject battleObject) { Dictionary dict = battleObjectDict; dict.Add(battleObject.id, battleObject); return battleObject; } public void RemoveBattleObject(BattleObject battleObject) { battleObjectDict.Remove(battleObject.id); if(battleObject.typeId == MapObjectUtil.TypeId.Door.GetHashCode()) { Door door = battleObject as Door; RemoveDoor(door); } } public void ClearAllBattleObject() { List list = new List(); Dictionary battleObjDict = GetBattleObjectDict(); foreach(KeyValuePair kvp in battleObjDict) { list.Add(kvp.Value); } for(int i=0; i GetBattleObjectByRange(Vector3 origin, float range, TeamUtil.Team team, List excepts = null) { List list = new List (); foreach(KeyValuePair item in battleObjectDict) { int id = item.Key; BattleObject obj = item.Value; bool add = false; if(team != TeamUtil.Team.None) { if(team.Equals(item.Value.team)) { add = true; } } else { add = true; } if(excepts != null && excepts.Contains(obj)) continue; if(add && NumberUtil.distanceVector3(origin, obj.position) <= range) { list.Add(item.Value); } } return list; } public List GetBattleObjectBySector(Vector3 origin, float direction, float range, TeamUtil.Team team, List excepts = null) { List list = new List (); foreach(KeyValuePair item in battleObjectDict) { int id = item.Key; BattleObject obj = item.Value; bool add = false; if(team != TeamUtil.Team.None) { if(team.Equals(item.Value.team)) { add = true; } } else { add = true; } if(excepts != null && excepts.Contains(obj)) continue; if(add && NumberUtil.distanceVector3(origin, obj.position) <= range) { float targetAngle = NumberUtil.radianToAngle(NumberUtil.getRadianByATan(obj.position.x, obj.position.z, origin.x, origin.z)); float originAngle = NumberUtil.radianToAngle(direction); float deltaAngle = Mathf.Abs(NumberUtil.corverAngleBetween(targetAngle - originAngle, -180f, 180f)); if(deltaAngle <= 30f) { list.Add(item.Value); } } } return list; } public List GetBattleObjectByFrontRect(Vector3 origin, float direction, float range, TeamUtil.Team team, List excepts = null) { List list = new List (); foreach(KeyValuePair item in battleObjectDict) { int id = item.Key; BattleObject obj = item.Value; bool add = false; if(team != TeamUtil.Team.None) { if(team.Equals(item.Value.team)) { add = true; } } else { add = true; } if(!add) continue; if(excepts != null && excepts.Contains(obj)) continue; float distance = NumberUtil.distanceVector3(origin, obj.position, true); if(distance <= range) { float targetRadian = NumberUtil.getRadianByATan(obj.position.x, obj.position.z, origin.x, origin.z); float targetAngle = NumberUtil.radianToAngle(targetRadian); float originAngle = NumberUtil.radianToAngle(direction); float deltaAngle = Mathf.Abs(NumberUtil.corverAngleBetween(targetAngle - originAngle, -180f, 180f)); float delatRadian = NumberUtil.angleToRadian(deltaAngle); float cos = Mathf.Cos(delatRadian) * distance; float sin = Mathf.Sin(delatRadian) * distance; Debuger.LogWarning(obj+" angle:"+deltaAngle+" cos:"+cos+" sin:"+sin+" range:"+range); if(deltaAngle <= 90f && cos < range && sin < 1.5f) { list.Add(item.Value); } } } return list; } public Craft GetNearestCraft(Vector3 origin, TeamUtil.Team team) { Craft craft = null; float minDis = float.MaxValue; foreach(KeyValuePair item in battleObjectDict) { if(item.Value is Craft && item.Value.team == team) { float dis = NumberUtil.distanceVector3(origin, item.Value.position, true); if(dis < minDis) { minDis = dis; craft = item.Value as Craft; } } } return craft; } public UAVehicle GetUAVehicle(int userId) { UAVehicle uav = null; uavDict.TryGetValue (userId, out uav); return uav; } public void AddUAVehicle(UAVehicle uav) { if (!uavDict.ContainsKey (uav.userId)) uavDict.Add (uav.userId, uav); else Debuger.LogError ("Already exist uav "+uav.userId); } public void RemoveUAVehicle(UAVehicle uav) { uavDict.Remove (uav.userId); } }