using FFXIVClassic_Map_Server; using FFXIVClassic.Common; using FFXIVClassic_Map_Server.actors.chara.npc; using FFXIVClassic_Map_Server.Actors; using FFXIVClassic_Map_Server.lua; using FFXIVClassic_Map_Server.packets.send.actor; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace FFXIVClassic_Map_Server.actors.area { class Zone : Area { Dictionary> privateAreas = new Dictionary>(); public Zone(uint id, string zoneName, ushort regionId, string className, ushort bgmDay, ushort bgmNight, ushort bgmBattle, bool isIsolated, bool isInn, bool canRideChocobo, bool canStealth, bool isInstanceRaid) : base(id, zoneName, regionId, className, bgmDay, bgmNight, bgmBattle, isIsolated, isInn, canRideChocobo, canStealth, isInstanceRaid) { } public void AddPrivateArea(PrivateArea pa) { if (privateAreas.ContainsKey(pa.GetPrivateAreaName())) privateAreas[pa.GetPrivateAreaName()][0] = pa; else { privateAreas[pa.GetPrivateAreaName()] = new Dictionary(); privateAreas[pa.GetPrivateAreaName()][0] = pa; } } public PrivateArea GetPrivateArea(string type, uint number) { if (privateAreas.ContainsKey(type)) { Dictionary instances = privateAreas[type]; if (instances.ContainsKey(number)) return instances[number]; else return null; } else return null; } public override SubPacket CreateScriptBindPacket(uint playerActorId) { bool isEntranceDesion = false; List lParams; lParams = LuaUtils.CreateLuaParamList("/Area/Zone/" + className, false, true, zoneName, "", -1, canRideChocobo ? (byte)1 : (byte)0, canStealth, isInn, false, false, false, true, isInstanceRaid, isEntranceDesion); return ActorInstantiatePacket.BuildPacket(actorId, playerActorId, actorName, className, lParams); } public void AddSpawnLocation(SpawnLocation spawn) { //Is it in a private area? if (!spawn.privAreaName.Equals("")) { if (privateAreas.ContainsKey(spawn.privAreaName)) { Dictionary levels = privateAreas[spawn.privAreaName]; if (levels.ContainsKey(spawn.privAreaLevel)) levels[spawn.privAreaLevel].AddSpawnLocation(spawn); else Program.Log.Error("Tried to add a spawn location to non-existing private area level \"{0}\" in area {1} in zone {2}", spawn.privAreaName, spawn.privAreaLevel, zoneName); } else Program.Log.Error("Tried to add a spawn location to non-existing private area \"{0}\" in zone {1}", spawn.privAreaName, zoneName); } else mSpawnLocations.Add(spawn); } public void SpawnAllActors(bool doPrivAreas) { foreach (SpawnLocation spawn in mSpawnLocations) SpawnActor(spawn); if (doPrivAreas) { foreach (Dictionary areas in privateAreas.Values) { foreach (PrivateArea pa in areas.Values) pa.SpawnAllActors(); } } } } }