1
Fork 0
mirror of https://bitbucket.org/Ioncannon/project-meteor-server.git synced 2025-04-22 12:47:46 +00:00

Merge branch 'ioncannon/quest_system' into Jorge/quest_system

This commit is contained in:
CuriousJorge 2022-02-05 14:21:57 -05:00
commit 4e5a07afa4
64 changed files with 429 additions and 526 deletions

View file

@ -1,84 +0,0 @@
--[[
PopulaceSpecialEventCryer Script
Actor Class script to handle the 6 NPCs (technically 3, the actors were duped) involved in the Foundation Day 2011 & 2012 events.
In 2011 they appear to be used for recruitment information for their respective Grand Company.
In 2012, they were used for exchanging Over-aspected Crystals/Clusters for GC seals as part of the ongoing Atomos event.
Functions:
For 2011.
eventTalkStep0(joined) - NPC dialog about joining their cause to fight back Imperials. joined = 0 or 1. Function has hardcoded actor IDs, won't work with 2012 versions
eventTalkNotGCmenber(npcGC) - NPC dialog when you're not part of their grand company.
For 2012.
eventTalkCrystalExchange(player, npcGC, hasCrystal) - NPC dialog explaining they want over-aspected crystals. Brings up crystal exchange prompt if hasCrystal = 1.
eventTalkCsOverflow(player, npcGC) - Error message that you can't hold the seals being offered.
eventTalkCrystalExchange2(player, npcGC) - NPC dialog for accepting exchange of crystals for seals
--]]
require ("global")
function init(npc)
return false, false, 0, 0;
end
local gcRep = {
[1001619] = 1, -- Maelstrom Representative 2011
[1002105] = 1, -- Maelstrom Representative 2012
[1001623] = 2, -- Adder Representative 2011
[1002109] = 2, -- Adder Representative 2012
[1001627] = 3, -- Flame Representative 2011
[1002113] = 3, -- Flame Representative 2012
}
function onEventStarted(player, npc, triggerName)
local playerGC = player.gcCurrent;
local npcId = npc:GetActorClassId();
local npcGC = gcRep[npcId];
local npcGCSeal = 1000200 + npcGC;
local hasCrystal = 1;
local crystal = 3020537;
local cluster = 3020413;
local eventMode = 2012;
if eventMode == 2011 then
if playerGC == 0 then
callClientFunction(player, "eventTalkStep0", 0);
elseif playerGC == npcGC then
callClientFunction(player, "eventTalkStep0", 1);
else
callClientFunction(player, "eventTalkNotGCmenber", npcGC);
end
elseif eventMode == 2012 then
choice = callClientFunction(player, "eventTalkCrystalExchange", player, npcGC, hasCrystal);
if choice == 1 then
--callClientFunction(player, "eventTalkCsOverflow", player, npcGC);
player:SendMessage(0x20, "", "You pretend to hand over four over-aspected crystals.");
callClientFunction(player, "eventTalkCrystalExchange2", player, npcGC);
local invCheck = player:GetItemPackage(INVENTORY_CURRENCY):AddItem(npcGCSeal, 1000, 1);
if invCheck == INV_ERROR_SUCCESS then
player:SendGameMessage(player, GetWorldMaster(), 25071, MESSAGE_TYPE_SYSTEM, crystal, 1, npcGCSeal, 1, 4, 1000);
end
elseif choice == 2 then
player:SendMessage(0x20, "", "You pretend to hand over an over-aspected cluster.");
--callClientFunction(player, "eventTalkCsOverflow", player, npcGC);
callClientFunction(player, "eventTalkCrystalExchange2", player, npcGC);
local invCheck = player:GetItemPackage(INVENTORY_CURRENCY):AddItem(npcGCSeal, 3000, 1);
if invCheck == INV_ERROR_SUCCESS then
player:SendGameMessage(player, GetWorldMaster(), 25071, MESSAGE_TYPE_SYSTEM, cluster, 1, npcGCSeal, 1, 1, 3000);
end
end
end
player:EndEvent();
end

View file

@ -23,16 +23,18 @@ function onTrigger(player, argc, animation, regionId, layoutId, maxLayoutId)
end end
local pos = player:GetPos(); local pos = player:GetPos();
local x = pos[0]; local x = pos[1];
local y = pos[1]; local y = pos[2];
local z = pos[2]; local z = pos[3];
local zone = pos[4]; local zone = pos[5];
actorClassId = tonumber(actorClassId); actorClassId = tonumber(actorClassId);
if (actorClassId ~= nil) then if (actorClassId ~= nil) then
zone = player:GetZone(); zone = player:GetZone();
actor = zone:SpawnActor(actorClassId, "mapobj", pos[0], pos[1], pos[2], tonumber(regionId), tonumber(layoutId)); actor = zone:SpawnActor(actorClassId, "mapobj", pos[1], pos[2], pos[3], tonumber(regionId), tonumber(layoutId));
print("test");
wait(0.8); wait(0.8);
actor:PlayMapObjAnimation(player, animation); actor:PlayMapObjAnimation(player, animation);
zone:DespawnActor("mapobj"); zone:DespawnActor("mapobj");

View file

@ -20,8 +20,8 @@ function onBeginLogin(player)
end end
--For Opening. Set Director and reset position incase d/c --For Opening. Set Director and reset position incase d/c
if (player:HasQuest(110001) == true and player:GetZoneID() == 193) then if (player:HasQuest(110001) == true and player.CurrentArea.ZoneId == 193) then
director = player:GetZone():CreateDirector("OpeningDirector", false); director = player.CurrentArea:CreateDirector("OpeningDirector", false);
player:AddDirector(director); player:AddDirector(director);
director:StartDirector(true); director:StartDirector(true);
player:SetLoginDirector(director); player:SetLoginDirector(director);
@ -32,8 +32,8 @@ function onBeginLogin(player)
player.positionZ = -36.91; player.positionZ = -36.91;
player.rotation = 0.025; player.rotation = 0.025;
player:GetQuest(110001):ClearData(); player:GetQuest(110001):ClearData();
elseif (player:HasQuest(110005) == true and player:GetZoneID() == 166) then elseif (player:HasQuest(110005) == true and player.CurrentArea.ZoneId == 166) then
director = player:GetZone():CreateDirector("OpeningDirector", false); director = player.CurrentArea:CreateDirector("OpeningDirector", false);
player:AddDirector(director); player:AddDirector(director);
director:StartDirector(false); director:StartDirector(false);
player:SetLoginDirector(director); player:SetLoginDirector(director);
@ -45,8 +45,8 @@ function onBeginLogin(player)
player.rotation = -1.26721; player.rotation = -1.26721;
player:GetQuest(110005):ClearQuestData(); player:GetQuest(110005):ClearQuestData();
player:GetQuest(110005):ClearQuestFlags(); player:GetQuest(110005):ClearQuestFlags();
elseif (player:HasQuest(110009) == true and player:GetZoneID() == 184) then elseif (player:HasQuest(110009) == true and player.CurrentArea.ZoneId == 184) then
--director = player:GetZone():CreateDirector("OpeningDirector", false); --director = player.CurrentArea:CreateDirector("OpeningDirector", false);
--player:AddDirector(director); --player:AddDirector(director);
--director:StartDirector(false); --director:StartDirector(false);
--player:SetLoginDirector(director); --player:SetLoginDirector(director);

View file

@ -0,0 +1,6 @@
shopInfo = {
welcomeText = 5,
shopPack = 3008,
tutorialId = 35
}

View file

@ -0,0 +1,6 @@
shopInfo = {
welcomeText = 94,
shopPack = 0x67,
shopCurrancy = nil
}

View file

@ -0,0 +1,7 @@
require ("global")
function onEventStarted(player, npc)
defaultSea = GetStaticActor("DftSea");
callClientFunction(player, "delegateEvent", player, defaultSea, "defaultTalkWithMerchant002_001", nil, nil, nil);
player:endEvent();
end

View file

@ -0,0 +1,5 @@
shopInfo = {
welcomeText = 97,
shopPack = 3010
}

View file

@ -0,0 +1,5 @@
shopInfo = {
welcomeText = 100,
shopPack = 3013
}

View file

@ -0,0 +1,5 @@
shopInfo = {
welcomeText = 99,
shopPack = 3012
}

View file

@ -0,0 +1,5 @@
shopInfo = {
welcomeText = 98,
shopPack = 3011
}

View file

@ -0,0 +1,5 @@
shopInfo = {
welcomeText = 106,
shopPack = 3007
}

View file

@ -0,0 +1,7 @@
shopInfo = {
selectMode = 2,
welcomeText = 281,
shopPack = {5001, 5002, 5007, 5008},
tutorialId = -1
}

View file

@ -0,0 +1,5 @@
shopInfo = {
welcomeText = 84,
shopPack = 3018
}

View file

@ -0,0 +1,7 @@
shopInfo = {
selectMode = 3,
welcomeText = 281,
shopPack = {5004, 5005, 5006, 5003},
tutorialId = -1
}

View file

@ -0,0 +1,5 @@
shopInfo = {
welcomeText = 103,
shopPack = 3015
}

View file

@ -0,0 +1,5 @@
shopInfo = {
welcomeText = 102,
shopPack = 3016
}

View file

@ -0,0 +1,5 @@
shopInfo = {
welcomeText = 104,
shopPack = 3017
}

View file

@ -0,0 +1,5 @@
shopInfo = {
welcomeText = 112,
shopPack = 3001
}

View file

@ -0,0 +1,5 @@
shopInfo = {
welcomeText = 96,
shopPack = 3009
}

View file

@ -0,0 +1,5 @@
shopInfo = {
welcomeText = 105,
shopPack = 3004
}

View file

@ -0,0 +1,5 @@
shopInfo = {
welcomeText = 108,
shopPack = 3006
}

View file

@ -0,0 +1,5 @@
shopInfo = {
welcomeText = 101,
shopPack = 3014
}

View file

@ -0,0 +1,5 @@
shopInfo = {
welcomeText = 237,
shopPack = 3023
}

View file

@ -0,0 +1,5 @@
shopInfo = {
welcomeText = 109,
shopPack = 3005
}

View file

@ -0,0 +1,6 @@
shopInfo = {
welcomeText = 69,
shopPack = 3020,
tutorialId = 35
}

View file

@ -0,0 +1,6 @@
shopInfo = {
welcomeText = 64,
shopPack = 3021,
tutorialId = 34
}

View file

@ -0,0 +1,6 @@
shopInfo = {
welcomeText = 76,
shopPack = 3022,
tutorialId = 39
}

View file

@ -0,0 +1,6 @@
shopInfo = {
welcomeText = 54,
shopPack = 3019,
tutorialId = 32
}

View file

@ -0,0 +1,5 @@
shopInfo = {
welcomeText = 265,
shopPack = 3024
}

View file

@ -0,0 +1,5 @@
shopInfo = {
welcomeText = 111,
shopPack = 3003
}

View file

@ -0,0 +1,5 @@
shopInfo = {
welcomeText = 110,
shopPack = 3002
}

View file

@ -62,7 +62,7 @@ namespace Meteor.Map.Actors
public uint actorId; public uint actorId;
public string actorName; public string actorName;
public uint displayNameId = 0xFFFFFFFF; public int displayNameId = -1;
public string customDisplayName; public string customDisplayName;
public ushort currentMainState = SetActorStatePacket.MAIN_STATE_PASSIVE; public ushort currentMainState = SetActorStatePacket.MAIN_STATE_PASSIVE;
@ -74,12 +74,10 @@ namespace Meteor.Map.Actors
public ushort moveState, oldMoveState; public ushort moveState, oldMoveState;
public float[] moveSpeeds = new float[4]; public float[] moveSpeeds = new float[4];
public uint zoneId, zoneId2; public Area CurrentArea { set; get; }
public string privateArea; public bool IsZoneing { set; get; }
public uint privateAreaType;
public Area zone = null;
public Area zone2 = null; public Area zone2 = null;
public bool isZoning = false;
public bool spawnedFirstTime = false; public bool spawnedFirstTime = false;
@ -463,7 +461,7 @@ namespace Meteor.Map.Actors
positionY = pos.Y; positionY = pos.Y;
positionZ = pos.Z; positionZ = pos.Z;
zone.UpdateActorPosition(this); CurrentArea.UpdateActorPosition(this);
//Program.Server.GetInstance().mLuaEngine.OnPath(actor, position, positionUpdates) //Program.Server.GetInstance().mLuaEngine.OnPath(actor, position, positionUpdates)
} }
@ -495,7 +493,7 @@ namespace Meteor.Map.Actors
updateFlags = ActorUpdateFlags.None; updateFlags = ActorUpdateFlags.None;
} }
zone.BroadcastPacketsAroundActor(this, packets); CurrentArea.BroadcastPacketsAroundActor(this, packets);
} }
public void GenerateActorName(int actorNumber) public void GenerateActorName(int actorNumber)
@ -511,7 +509,7 @@ namespace Meteor.Map.Actors
className = Char.ToLowerInvariant(className[0]) + className.Substring(1); className = Char.ToLowerInvariant(className[0]) + className.Substring(1);
//Format Zone Name //Format Zone Name
string zoneName = zone.zoneName.Replace("Field", "Fld") string zoneName = CurrentArea.ZoneName.Replace("Field", "Fld")
.Replace("Dungeon", "Dgn") .Replace("Dungeon", "Dgn")
.Replace("Town", "Twn") .Replace("Town", "Twn")
.Replace("Battle", "Btl") .Replace("Battle", "Btl")
@ -519,7 +517,7 @@ namespace Meteor.Map.Actors
.Replace("Event", "Evt") .Replace("Event", "Evt")
.Replace("Ship", "Shp") .Replace("Ship", "Shp")
.Replace("Office", "Ofc"); .Replace("Office", "Ofc");
if (zone is PrivateArea) if (CurrentArea is PrivateArea)
{ {
//Check if "normal" //Check if "normal"
zoneName = zoneName.Remove(zoneName.Length - 1, 1) + "P"; zoneName = zoneName.Remove(zoneName.Length - 1, 1) + "P";
@ -537,10 +535,8 @@ namespace Meteor.Map.Actors
string classNumber = Utils.ToStringBase63(actorNumber); string classNumber = Utils.ToStringBase63(actorNumber);
//Get stuff after @ //Get stuff after @
uint zoneId = zone.actorId; uint zoneId = CurrentArea.ZoneId;
uint privLevel = 0; int privLevel = CurrentArea.GetPrivateAreaType();
if (zone is PrivateArea)
privLevel = ((PrivateArea)zone).GetPrivateAreaType();
actorName = String.Format("{0}_{1}_{2}@{3:X3}{4:X2}", className, zoneName, classNumber, zoneId, privLevel); actorName = String.Format("{0}_{1}_{2}@{3:X3}{4:X2}", className, zoneName, classNumber, zoneId, privLevel);
} }
@ -629,13 +625,14 @@ namespace Meteor.Map.Actors
#region positioning #region positioning
public List<float> GetPos() public List<float> GetPos()
{ {
List<float> pos = new List<float>(); List<float> pos = new List<float>
{
pos.Add(positionX); positionX,
pos.Add(positionY); positionY,
pos.Add(positionZ); positionZ,
pos.Add(rotation); rotation,
pos.Add(zoneId); CurrentArea.ZoneId
};
return pos; return pos;
} }
@ -658,17 +655,7 @@ namespace Meteor.Map.Actors
rotation = rot; rotation = rot;
// todo: handle zone? // todo: handle zone?
zone.BroadcastPacketAroundActor(this, MoveActorToPositionPacket.BuildPacket(actorId, x, y, z, rot, moveState)); CurrentArea.BroadcastPacketAroundActor(this, MoveActorToPositionPacket.BuildPacket(actorId, x, y, z, rot, moveState));
}
public Area GetZone()
{
return zone;
}
public uint GetZoneID()
{
return zoneId;
} }
public void LookAt(Actor actor) public void LookAt(Actor actor)

View file

@ -34,8 +34,9 @@ namespace Meteor.Map.Actors
{ {
class Area : Actor class Area : Actor
{ {
public string zoneName; public string ZoneName { get; private set; }
public ushort regionId; public uint ZoneId { get; private set; }
public ushort RegionId { get; private set; }
public bool isIsolated, canStealth, isInn, canRideChocobo, isInstanceRaid; public bool isIsolated, canStealth, isInn, canRideChocobo, isInstanceRaid;
public ushort weatherNormal, weatherCommon, weatherRare; public ushort weatherNormal, weatherCommon, weatherRare;
public ushort bgmDay, bgmNight, bgmBattle; public ushort bgmDay, bgmNight, bgmBattle;
@ -59,12 +60,13 @@ namespace Meteor.Map.Actors
LuaScript areaScript; LuaScript areaScript;
public Area(uint id, string zoneName, ushort regionId, string classPath, ushort bgmDay, ushort bgmNight, ushort bgmBattle, bool isIsolated, bool isInn, bool canRideChocobo, bool canStealth, bool isInstanceRaid) public Area(uint zoneId, string zoneName, ushort regionId, string classPath, ushort bgmDay, ushort bgmNight, ushort bgmBattle, bool isIsolated, bool isInn, bool canRideChocobo, bool canStealth, bool isInstanceRaid)
: base(id) : base((4 << 28 | zoneId << 19 | ((uint)1)))
{ {
ZoneName = zoneName;
ZoneId = zoneId;
RegionId = regionId;
this.zoneName = zoneName;
this.regionId = regionId;
this.canStealth = canStealth; this.canStealth = canStealth;
this.isIsolated = isIsolated; this.isIsolated = isIsolated;
this.isInn = isInn; this.isInn = isInn;
@ -77,7 +79,7 @@ namespace Meteor.Map.Actors
this.displayNameId = 0; this.displayNameId = 0;
this.customDisplayName = "_areaMaster"; this.customDisplayName = "_areaMaster";
this.actorName = String.Format("_areaMaster@{0:X5}", id << 8); this.actorName = String.Format("_areaMaster@{0:X5}", zoneId << 8);
this.classPath = classPath; this.classPath = classPath;
this.className = classPath.Substring(classPath.LastIndexOf("/") + 1); this.className = classPath.Substring(classPath.LastIndexOf("/") + 1);
@ -97,10 +99,20 @@ namespace Meteor.Map.Actors
} }
} }
public virtual string GetPrivateAreaName()
{
return "";
}
public virtual int GetPrivateAreaType()
{
return 0;
}
public override SubPacket CreateScriptBindPacket() public override SubPacket CreateScriptBindPacket()
{ {
List<LuaParam> lParams; List<LuaParam> lParams;
lParams = LuaUtils.CreateLuaParamList(classPath, false, true, zoneName, "/Area/Zone/ZoneDefault", -1, (byte)1, true, false, false, false, false, false, false, false); lParams = LuaUtils.CreateLuaParamList(classPath, false, true, ZoneName, "/Area/Zone/ZoneDefault", -1, (byte)1, true, false, false, false, false, false, false, false);
return ActorInstantiatePacket.BuildPacket(actorId, actorName, "ZoneDefault", lParams); return ActorInstantiatePacket.BuildPacket(actorId, actorName, "ZoneDefault", lParams);
} }

View file

@ -30,32 +30,31 @@ namespace Meteor.Map.actors.area
{ {
class PrivateArea : Area class PrivateArea : Area
{ {
private Zone parentZone; private readonly Zone ParentZone;
private string privateAreaName; private readonly string PrivateAreaName;
private uint privateAreaType; private readonly int PrivateAreaType;
public PrivateArea(Zone parent, uint id, string classPath, string privateAreaName, uint privateAreaType, ushort bgmDay, ushort bgmNight, ushort bgmBattle) public PrivateArea(Zone parent, string classPath, string privateAreaName, int privateAreaType, ushort bgmDay, ushort bgmNight, ushort bgmBattle)
: base(id, parent.zoneName, parent.regionId, classPath, bgmDay, bgmNight, bgmBattle, parent.isIsolated, parent.isInn, parent.canRideChocobo, parent.canStealth, true) : base(parent.ZoneId, parent.ZoneName, parent.RegionId, classPath, bgmDay, bgmNight, bgmBattle, parent.isIsolated, parent.isInn, parent.canRideChocobo, parent.canStealth, true)
{ {
this.parentZone = parent; this.ParentZone = parent;
this.zoneName = parent.zoneName; this.PrivateAreaName = privateAreaName;
this.privateAreaName = privateAreaName; this.PrivateAreaType = privateAreaType;
this.privateAreaType = privateAreaType;
} }
public string GetPrivateAreaName() public override string GetPrivateAreaName()
{ {
return privateAreaName; return PrivateAreaName;
} }
public uint GetPrivateAreaType() public override int GetPrivateAreaType()
{ {
return privateAreaType; return PrivateAreaType;
} }
public Zone GetParentZone() public Zone GetParentZone()
{ {
return parentZone; return ParentZone;
} }
public override SubPacket CreateScriptBindPacket() public override SubPacket CreateScriptBindPacket()
@ -66,7 +65,7 @@ namespace Meteor.Map.actors.area
string realClassName = className.Substring(className.LastIndexOf("/") + 1); string realClassName = className.Substring(className.LastIndexOf("/") + 1);
lParams = LuaUtils.CreateLuaParamList(classPath, false, true, zoneName, privateAreaName, privateAreaType, canRideChocobo ? (byte)1 : (byte)0, canStealth, isInn, false, false, false, false, false, false); lParams = LuaUtils.CreateLuaParamList(classPath, false, true, ZoneName, PrivateAreaName, PrivateAreaType, canRideChocobo ? (byte)1 : (byte)0, canStealth, isInn, false, false, false, false, false, false);
ActorInstantiatePacket.BuildPacket(actorId, actorName, realClassName, lParams).DebugPrintSubPacket(); ActorInstantiatePacket.BuildPacket(actorId, actorName, realClassName, lParams).DebugPrintSubPacket();
return ActorInstantiatePacket.BuildPacket(actorId, actorName, realClassName, lParams); return ActorInstantiatePacket.BuildPacket(actorId, actorName, realClassName, lParams);
} }

View file

@ -37,8 +37,8 @@ namespace Meteor.Map.actors.area
return null; return null;
} }
public PrivateAreaContent(Zone parent, string classPath, string privateAreaName, uint privateAreaType, Director director, Player contentStarter) //TODO: Make it a list public PrivateAreaContent(Zone parent, string classPath, string privateAreaName, int privateAreaType, Director director, Player contentStarter) //TODO: Make it a list
: base(parent, parent.actorId, classPath, privateAreaName, privateAreaType, 0, 0, 0) : base(parent, classPath, privateAreaName, privateAreaType, 0, 0, 0)
{ {
currentDirector = director; currentDirector = director;
LuaEngine.GetInstance().CallLuaFunction(contentStarter, this, "onCreate", false, currentDirector); LuaEngine.GetInstance().CallLuaFunction(contentStarter, this, "onCreate", false, currentDirector);

View file

@ -27,7 +27,7 @@ namespace Meteor.Map.actors.area
public string uniqueId; public string uniqueId;
public uint zoneId; public uint zoneId;
public string privAreaName; public string privAreaName;
public uint privAreaLevel; public int privAreaLevel;
public float x; public float x;
public float y; public float y;
public float z; public float z;
@ -35,7 +35,7 @@ namespace Meteor.Map.actors.area
public ushort state; public ushort state;
public uint animId; public uint animId;
public SpawnLocation(uint classId, string uniqueId, uint zoneId, string privAreaName, uint privAreaLevel, float x, float y, float z, float rot, ushort state, uint animId) public SpawnLocation(uint classId, string uniqueId, uint zoneId, string privAreaName, int privAreaLevel, float x, float y, float z, float rot, ushort state, uint animId)
{ {
this.classId = classId; this.classId = classId;
this.uniqueId = uniqueId; this.uniqueId = uniqueId;

View file

@ -31,7 +31,7 @@ namespace Meteor.Map.actors.area
{ {
class Zone : Area class Zone : Area
{ {
Dictionary<string, Dictionary<uint, PrivateArea>> privateAreas = new Dictionary<string, Dictionary<uint, PrivateArea>>(); Dictionary<string, Dictionary<int, PrivateArea>> privateAreas = new Dictionary<string, Dictionary<int, PrivateArea>>();
Dictionary<string, List<PrivateAreaContent>> contentAreas = new Dictionary<string, List<PrivateAreaContent>>(); Dictionary<string, List<PrivateAreaContent>> contentAreas = new Dictionary<string, List<PrivateAreaContent>>();
Object contentAreasLock = new Object(); Object contentAreasLock = new Object();
@ -68,18 +68,20 @@ namespace Meteor.Map.actors.area
privateAreas[pa.GetPrivateAreaName()][pa.GetPrivateAreaType()] = pa; privateAreas[pa.GetPrivateAreaName()][pa.GetPrivateAreaType()] = pa;
else else
{ {
privateAreas[pa.GetPrivateAreaName()] = new Dictionary<uint, PrivateArea>(); privateAreas[pa.GetPrivateAreaName()] = new Dictionary<int, PrivateArea>
privateAreas[pa.GetPrivateAreaName()][pa.GetPrivateAreaType()] = pa; {
[pa.GetPrivateAreaType()] = pa
};
} }
} }
public PrivateArea GetPrivateArea(string type, uint number) public PrivateArea GetPrivateArea(string name, int type)
{ {
if (privateAreas.ContainsKey(type)) if (privateAreas.ContainsKey(name))
{ {
Dictionary<uint, PrivateArea> instances = privateAreas[type]; Dictionary<int, PrivateArea> instances = privateAreas[name];
if (instances.ContainsKey(number)) if (instances.ContainsKey(type))
return instances[number]; return instances[type];
else else
return null; return null;
} }
@ -92,7 +94,7 @@ namespace Meteor.Map.actors.area
bool isEntranceDesion = false; bool isEntranceDesion = false;
List<LuaParam> lParams; List<LuaParam> lParams;
lParams = LuaUtils.CreateLuaParamList(classPath, false, true, zoneName, "", -1, canRideChocobo ? (byte)1 : (byte)0, canStealth, isInn, false, false, false, true, isInstanceRaid, isEntranceDesion); lParams = LuaUtils.CreateLuaParamList(classPath, false, true, ZoneName, "", -1, canRideChocobo ? (byte)1 : (byte)0, canStealth, isInn, false, false, false, true, isInstanceRaid, isEntranceDesion);
return ActorInstantiatePacket.BuildPacket(actorId, actorName, className, lParams); return ActorInstantiatePacket.BuildPacket(actorId, actorName, className, lParams);
} }
@ -103,14 +105,14 @@ namespace Meteor.Map.actors.area
{ {
if (privateAreas.ContainsKey(spawn.privAreaName)) if (privateAreas.ContainsKey(spawn.privAreaName))
{ {
Dictionary<uint, PrivateArea> levels = privateAreas[spawn.privAreaName]; Dictionary<int, PrivateArea> levels = privateAreas[spawn.privAreaName];
if (levels.ContainsKey(spawn.privAreaLevel)) if (levels.ContainsKey(spawn.privAreaLevel))
levels[spawn.privAreaLevel].AddSpawnLocation(spawn); levels[spawn.privAreaLevel].AddSpawnLocation(spawn);
else 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); 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 else
Program.Log.Error("Tried to add a spawn location to non-existing private area \"{0}\" in zone {1}", spawn.privAreaName, zoneName); Program.Log.Error("Tried to add a spawn location to non-existing private area \"{0}\" in zone {1}", spawn.privAreaName, ZoneName);
} }
else else
mSpawnLocations.Add(spawn); mSpawnLocations.Add(spawn);
@ -123,7 +125,7 @@ namespace Meteor.Map.actors.area
if (doPrivAreas) if (doPrivAreas)
{ {
foreach (Dictionary<uint, PrivateArea> areas in privateAreas.Values) foreach (var areas in privateAreas.Values)
{ {
foreach (PrivateArea pa in areas.Values) foreach (PrivateArea pa in areas.Values)
pa.SpawnAllActors(); pa.SpawnAllActors();
@ -137,7 +139,7 @@ namespace Meteor.Map.actors.area
{ {
if (!mActorList.ContainsKey(id)) if (!mActorList.ContainsKey(id))
{ {
foreach (Dictionary<uint, PrivateArea> paList in privateAreas.Values) foreach (var paList in privateAreas.Values)
{ {
foreach (PrivateArea pa in paList.Values) foreach (PrivateArea pa in paList.Values)
{ {

View file

@ -335,7 +335,7 @@ namespace Meteor.Map.actors.chara.ai
return false; return false;
} }
if (target.zone != user.zone) if (target.CurrentArea != user.CurrentArea)
return false; return false;
return true; return true;

View file

@ -45,7 +45,7 @@ namespace Meteor.Map.actors.chara.ai.controllers
contentGroupCharas = new List<Character>(owner.currentContentGroup.GetMemberCount()); contentGroupCharas = new List<Character>(owner.currentContentGroup.GetMemberCount());
foreach (var charaId in owner.currentContentGroup.GetMembers()) foreach (var charaId in owner.currentContentGroup.GetMembers())
{ {
var chara = owner.zone.FindActorInArea<Character>(charaId); var chara = owner.CurrentArea.FindActorInArea<Character>(charaId);
if (chara != null) if (chara != null)
contentGroupCharas.Add(chara); contentGroupCharas.Add(chara);

View file

@ -98,7 +98,7 @@ namespace Meteor.Map.actors.chara.ai.controllers
{ {
if (!owner.neutral && owner.IsAlive()) if (!owner.neutral && owner.IsAlive())
{ {
foreach (var chara in owner.zone.GetActorsAroundActor<Character>(owner, 50)) foreach (var chara in owner.CurrentArea.GetActorsAroundActor<Character>(owner, 50))
{ {
if (chara.allegiance == owner.allegiance) if (chara.allegiance == owner.allegiance)
continue; continue;
@ -276,7 +276,7 @@ namespace Meteor.Map.actors.chara.ai.controllers
{ {
if (owner.target is Player) if (owner.target is Player)
{ {
foreach (var chara in owner.zone.GetActorsAroundActor<Character>(owner, 1)) foreach (var chara in owner.CurrentArea.GetActorsAroundActor<Character>(owner, 1))
{ {
if (chara == owner) if (chara == owner)
continue; continue;
@ -404,7 +404,7 @@ namespace Meteor.Map.actors.chara.ai.controllers
public virtual bool CanSeePoint(float x, float y, float z) public virtual bool CanSeePoint(float x, float y, float z)
{ {
return NavmeshUtils.CanSee((Zone)owner.zone, owner.positionX, owner.positionY, owner.positionZ, x, y, z); return NavmeshUtils.CanSee((Zone)owner.CurrentArea, owner.positionX, owner.positionY, owner.positionZ, x, y, z);
} }
protected virtual void HandleHate() protected virtual void HandleHate()
@ -420,7 +420,7 @@ namespace Meteor.Map.actors.chara.ai.controllers
owner.currentLockedTarget = target?.actorId ?? Actor.INVALID_ACTORID; owner.currentLockedTarget = target?.actorId ?? Actor.INVALID_ACTORID;
owner.currentTarget = target?.actorId ?? Actor.INVALID_ACTORID; owner.currentTarget = target?.actorId ?? Actor.INVALID_ACTORID;
foreach (var player in owner.zone.GetActorsAroundActor<Player>(owner, 50)) foreach (var player in owner.CurrentArea.GetActorsAroundActor<Player>(owner, 50))
player.QueuePacket(owner.GetHateTypePacket(player)); player.QueuePacket(owner.GetHateTypePacket(player));
base.ChangeTarget(target); base.ChangeTarget(target);

View file

@ -55,17 +55,17 @@ namespace Meteor.Map.actors.chara.ai
{ {
PreparePath(dest.X, dest.Y, dest.Z, stepSize, maxPath, polyRadius); PreparePath(dest.X, dest.Y, dest.Z, stepSize, maxPath, polyRadius);
} }
//TODO: Verify pathfind with new area setup
public void PreparePath(float x, float y, float z, float stepSize = 1.25f, int maxPath = 40, float polyRadius = 0.0f) public void PreparePath(float x, float y, float z, float stepSize = 1.25f, int maxPath = 40, float polyRadius = 0.0f)
{ {
var pos = new Vector3(owner.positionX, owner.positionY, owner.positionZ); var pos = new Vector3(owner.positionX, owner.positionY, owner.positionZ);
var dest = new Vector3(x, y, z); var dest = new Vector3(x, y, z);
Zone zone; Zone zone;
if (owner.GetZone() is PrivateArea || owner.GetZone() is PrivateAreaContent) if (owner.CurrentArea is PrivateArea || owner.CurrentArea is PrivateAreaContent)
zone = (Zone)((PrivateArea)owner.GetZone()).GetParentZone(); zone = (Zone)((PrivateArea)owner.CurrentArea).GetParentZone();
else else
zone = (Zone)owner.GetZone(); zone = (Zone)owner.CurrentArea;
var sw = new System.Diagnostics.Stopwatch(); var sw = new System.Diagnostics.Stopwatch();
sw.Start(); sw.Start();

View file

@ -285,7 +285,7 @@ namespace Meteor.Map.actors.chara.ai
{ {
foreach (var actorId in party.members) foreach (var actorId in party.members)
{ {
AddTarget(owner.zone.FindActorInArea<Character>(actorId), withPet); AddTarget(owner.CurrentArea.FindActorInArea<Character>(actorId), withPet);
} }
} }
} }
@ -299,7 +299,7 @@ namespace Meteor.Map.actors.chara.ai
private void AddAllBattleNpcs(Character target, bool withPet) private void AddAllBattleNpcs(Character target, bool withPet)
{ {
int dist = (int)maxDistance; int dist = (int)maxDistance;
var actors = owner.zone.GetActorsAroundActor<BattleNpc>(target, dist); var actors = owner.CurrentArea.GetActorsAroundActor<BattleNpc>(target, dist);
foreach (BattleNpc actor in actors) foreach (BattleNpc actor in actors)
{ {
@ -309,7 +309,7 @@ namespace Meteor.Map.actors.chara.ai
private void AddAllInZone(Character target, bool withPet) private void AddAllInZone(Character target, bool withPet)
{ {
var actors = owner.zone.GetAllActors<Character>(); var actors = owner.CurrentArea.GetAllActors<Character>();
foreach (Character actor in actors) foreach (Character actor in actors)
{ {
AddTarget(actor, withPet); AddTarget(actor, withPet);
@ -319,7 +319,7 @@ namespace Meteor.Map.actors.chara.ai
private void AddAllInRange(Character target, bool withPet) private void AddAllInRange(Character target, bool withPet)
{ {
int dist = (int)maxDistance; int dist = (int)maxDistance;
var actors = owner.zone.GetActorsAroundActor<Character>(target, dist); var actors = owner.CurrentArea.GetActorsAroundActor<Character>(target, dist);
foreach (Character actor in actors) foreach (Character actor in actors)
{ {
@ -408,7 +408,7 @@ namespace Meteor.Map.actors.chara.ai
return false; return false;
} }
if (/*target.isZoning || owner.isZoning || */target.zone != owner.zone) if (/*target.isZoning || owner.isZoning || */target.CurrentArea != owner.CurrentArea)
return false; return false;
if (validTarget == ValidTarget.Self && aoeType == TargetFindAOEType.None && owner != target) if (validTarget == ValidTarget.Self && aoeType == TargetFindAOEType.None && owner != target)

View file

@ -50,7 +50,7 @@ namespace Meteor.Map.actors.chara.ai.state
public override bool Update(DateTime tick) public override bool Update(DateTime tick)
{ {
if ((target == null || owner.target != target || owner.target?.actorId != owner.currentLockedTarget) && owner.isAutoAttackEnabled) if ((target == null || owner.target != target || owner.target?.actorId != owner.currentLockedTarget) && owner.isAutoAttackEnabled)
owner.aiContainer.ChangeTarget(target = owner.zone.FindActorInArea<Character>(owner.currentTarget)); owner.aiContainer.ChangeTarget(target = owner.CurrentArea.FindActorInArea<Character>(owner.currentTarget));
if (target == null || target.IsDead()) if (target == null || target.IsDead())
{ {
@ -91,7 +91,7 @@ namespace Meteor.Map.actors.chara.ai.state
// todo: send paralyzed/sleep message etc. // todo: send paralyzed/sleep message etc.
if (errorResult != null) if (errorResult != null)
{ {
owner.zone.BroadcastPacketAroundActor(owner, CommandResultX01Packet.BuildPacket(errorResult.targetId, errorResult.animation, 0x765D, errorResult)); owner.CurrentArea.BroadcastPacketAroundActor(owner, CommandResultX01Packet.BuildPacket(errorResult.targetId, errorResult.animation, 0x765D, errorResult));
errorResult = null; errorResult = null;
} }
} }

View file

@ -215,7 +215,7 @@ namespace Meteor.Map.Actors
ActorPropertyPacketUtil propPacketUtil = new ActorPropertyPacketUtil("charaWork/currentContentGroup", this); ActorPropertyPacketUtil propPacketUtil = new ActorPropertyPacketUtil("charaWork/currentContentGroup", this);
propPacketUtil.AddProperty("charaWork.currentContentGroup"); propPacketUtil.AddProperty("charaWork.currentContentGroup");
zone.BroadcastPacketsAroundActor(this, propPacketUtil.Done()); CurrentArea.BroadcastPacketsAroundActor(this, propPacketUtil.Done());
} }
//This logic isn't correct, order of GetStatusEffects() is not necessarily the same as the actual effects in game. Also sending every time at once isn't needed //This logic isn't correct, order of GetStatusEffects() is not necessarily the same as the actual effects in game. Also sending every time at once isn't needed
@ -243,17 +243,17 @@ namespace Meteor.Map.Actors
((Player)this).QueuePacket(PlayAnimationOnActorPacket.BuildPacket(actorId, animId)); ((Player)this).QueuePacket(PlayAnimationOnActorPacket.BuildPacket(actorId, animId));
} }
else else
zone.BroadcastPacketAroundActor(this, PlayAnimationOnActorPacket.BuildPacket(actorId, animId)); CurrentArea.BroadcastPacketAroundActor(this, PlayAnimationOnActorPacket.BuildPacket(actorId, animId));
} }
public void DoBattleAction(ushort commandId, uint animationId) public void DoBattleAction(ushort commandId, uint animationId)
{ {
zone.BroadcastPacketAroundActor(this, CommandResultX00Packet.BuildPacket(actorId, animationId, commandId)); CurrentArea.BroadcastPacketAroundActor(this, CommandResultX00Packet.BuildPacket(actorId, animationId, commandId));
} }
public void DoBattleAction(ushort commandId, uint animationId, CommandResult result) public void DoBattleAction(ushort commandId, uint animationId, CommandResult result)
{ {
zone.BroadcastPacketAroundActor(this, CommandResultX01Packet.BuildPacket(actorId, animationId, commandId, result)); CurrentArea.BroadcastPacketAroundActor(this, CommandResultX01Packet.BuildPacket(actorId, animationId, commandId, result));
} }
public void DoBattleAction(ushort commandId, uint animationId, CommandResult[] results) public void DoBattleAction(ushort commandId, uint animationId, CommandResult[] results)
@ -263,12 +263,12 @@ namespace Meteor.Map.Actors
while (true) while (true)
{ {
if (results.Length - currentIndex >= 10) if (results.Length - currentIndex >= 10)
zone.BroadcastPacketAroundActor(this, CommandResultX18Packet.BuildPacket(actorId, animationId, commandId, results, ref currentIndex)); CurrentArea.BroadcastPacketAroundActor(this, CommandResultX18Packet.BuildPacket(actorId, animationId, commandId, results, ref currentIndex));
else if (results.Length - currentIndex > 1) else if (results.Length - currentIndex > 1)
zone.BroadcastPacketAroundActor(this, CommandResultX10Packet.BuildPacket(actorId, animationId, commandId, results, ref currentIndex)); CurrentArea.BroadcastPacketAroundActor(this, CommandResultX10Packet.BuildPacket(actorId, animationId, commandId, results, ref currentIndex));
else if (results.Length - currentIndex == 1) else if (results.Length - currentIndex == 1)
{ {
zone.BroadcastPacketAroundActor(this, CommandResultX01Packet.BuildPacket(actorId, animationId, commandId, results[currentIndex])); CurrentArea.BroadcastPacketAroundActor(this, CommandResultX01Packet.BuildPacket(actorId, animationId, commandId, results[currentIndex]));
currentIndex++; currentIndex++;
} }
else else
@ -283,12 +283,12 @@ namespace Meteor.Map.Actors
while (true) while (true)
{ {
if (results.Count - currentIndex >= 10) if (results.Count - currentIndex >= 10)
zone.BroadcastPacketAroundActor(this, CommandResultX18Packet.BuildPacket(actorId, animationId, commandId, results, ref currentIndex)); CurrentArea.BroadcastPacketAroundActor(this, CommandResultX18Packet.BuildPacket(actorId, animationId, commandId, results, ref currentIndex));
else if (results.Count - currentIndex > 1) else if (results.Count - currentIndex > 1)
zone.BroadcastPacketAroundActor(this, CommandResultX10Packet.BuildPacket(actorId, animationId, commandId, results, ref currentIndex)); CurrentArea.BroadcastPacketAroundActor(this, CommandResultX10Packet.BuildPacket(actorId, animationId, commandId, results, ref currentIndex));
else if (results.Count - currentIndex == 1) else if (results.Count - currentIndex == 1)
{ {
zone.BroadcastPacketAroundActor(this, CommandResultX01Packet.BuildPacket(actorId, animationId, commandId, results[currentIndex])); CurrentArea.BroadcastPacketAroundActor(this, CommandResultX01Packet.BuildPacket(actorId, animationId, commandId, results[currentIndex]));
currentIndex++; currentIndex++;
} }
else else
@ -504,7 +504,7 @@ namespace Meteor.Map.Actors
} }
//if (targid != 0) //if (targid != 0)
{ {
aiContainer.Engage(zone.FindActorInArea<Character>(targid)); aiContainer.Engage(CurrentArea.FindActorInArea<Character>(targid));
} }
} }
@ -535,19 +535,19 @@ namespace Meteor.Map.Actors
public virtual void Cast(uint spellId, uint targetId = 0) public virtual void Cast(uint spellId, uint targetId = 0)
{ {
if (aiContainer.CanChangeState()) if (aiContainer.CanChangeState())
aiContainer.Cast(zone.FindActorInArea<Character>(targetId == 0 ? currentTarget : targetId), spellId); aiContainer.Cast(CurrentArea.FindActorInArea<Character>(targetId == 0 ? currentTarget : targetId), spellId);
} }
public virtual void Ability(uint abilityId, uint targetId = 0) public virtual void Ability(uint abilityId, uint targetId = 0)
{ {
if (aiContainer.CanChangeState()) if (aiContainer.CanChangeState())
aiContainer.Ability(zone.FindActorInArea<Character>(targetId == 0 ? currentTarget : targetId), abilityId); aiContainer.Ability(CurrentArea.FindActorInArea<Character>(targetId == 0 ? currentTarget : targetId), abilityId);
} }
public virtual void WeaponSkill(uint skillId, uint targetId = 0) public virtual void WeaponSkill(uint skillId, uint targetId = 0)
{ {
if (aiContainer.CanChangeState()) if (aiContainer.CanChangeState())
aiContainer.WeaponSkill(zone.FindActorInArea<Character>(targetId == 0 ? currentTarget : targetId), skillId); aiContainer.WeaponSkill(CurrentArea.FindActorInArea<Character>(targetId == 0 ? currentTarget : targetId), skillId);
} }
public virtual void Spawn(DateTime tick) public virtual void Spawn(DateTime tick)
@ -806,7 +806,7 @@ namespace Meteor.Map.Actors
foreach (CommandResult action in actions) foreach (CommandResult action in actions)
{ {
if (zone.FindActorInArea<Character>(action.targetId) is Character) if (CurrentArea.FindActorInArea<Character>(action.targetId) is Character)
{ {
//BattleUtils.HandleHitType(this, chara, action); //BattleUtils.HandleHitType(this, chara, action);
//BattleUtils.DoAction(this, chara, action, DamageTakenType.Magic); //BattleUtils.DoAction(this, chara, action, DamageTakenType.Magic);
@ -822,7 +822,7 @@ namespace Meteor.Map.Actors
foreach (CommandResult action in actions) foreach (CommandResult action in actions)
{ {
//Should we just store the character insteado f having to find it again? //Should we just store the character insteado f having to find it again?
if (zone.FindActorInArea<Character>(action.targetId) is Character) if (CurrentArea.FindActorInArea<Character>(action.targetId) is Character)
{ {
//BattleUtils.DoAction(this, chara, action, DamageTakenType.Weaponskill); //BattleUtils.DoAction(this, chara, action, DamageTakenType.Weaponskill);
} }
@ -835,7 +835,7 @@ namespace Meteor.Map.Actors
{ {
foreach (var action in actions) foreach (var action in actions)
{ {
if (zone.FindActorInArea<Character>(action.targetId) is Character) if (CurrentArea.FindActorInArea<Character>(action.targetId) is Character)
{ {
//BattleUtils.DoAction(this, chara, action, DamageTakenType.Ability); //BattleUtils.DoAction(this, chara, action, DamageTakenType.Ability);
} }

View file

@ -25,7 +25,7 @@ namespace Meteor.Map.actors.chara.npc
{ {
public readonly uint actorClassId; public readonly uint actorClassId;
public readonly string classPath; public readonly string classPath;
public readonly uint displayNameId; public readonly int displayNameId;
public readonly uint propertyFlags; public readonly uint propertyFlags;
public readonly string eventConditions; public readonly string eventConditions;
@ -33,7 +33,7 @@ namespace Meteor.Map.actors.chara.npc
public readonly ushort pushCommandSub; public readonly ushort pushCommandSub;
public readonly byte pushCommandPriority; public readonly byte pushCommandPriority;
public ActorClass(uint id, string classPath, uint nameId, uint propertyFlags, string eventConditions, ushort pushCommand, ushort pushCommandSub, byte pushCommandPriority) public ActorClass(uint id, string classPath, int nameId, uint propertyFlags, string eventConditions, ushort pushCommand, ushort pushCommandSub, byte pushCommandPriority)
{ {
this.actorClassId = id; this.actorClassId = id;
this.classPath = classPath; this.classPath = classPath;

View file

@ -263,8 +263,8 @@ namespace Meteor.Map.Actors
this.isMovingToSpawn = false; this.isMovingToSpawn = false;
this.hateContainer.ClearHate(); this.hateContainer.ClearHate();
zone.BroadcastPacketsAroundActor(this, GetSpawnPackets(null, 0x01)); CurrentArea.BroadcastPacketsAroundActor(this, GetSpawnPackets(null, 0x01));
zone.BroadcastPacketsAroundActor(this, GetInitPackets()); CurrentArea.BroadcastPacketsAroundActor(this, GetInitPackets());
RecalculateStats(); RecalculateStats();
OnSpawn(); OnSpawn();
@ -292,7 +292,7 @@ namespace Meteor.Map.Actors
{ {
foreach (var memberId in ((Party)lastAttacker.currentParty).members) foreach (var memberId in ((Party)lastAttacker.currentParty).members)
{ {
var partyMember = zone.FindActorInArea<Character>(memberId); var partyMember = CurrentArea.FindActorInArea<Character>(memberId);
// onDeath(monster, player, killer) // onDeath(monster, player, killer)
lua.LuaEngine.CallLuaBattleFunction(this, "onDeath", this, partyMember, lastAttacker); lua.LuaEngine.CallLuaBattleFunction(this, "onDeath", this, partyMember, lastAttacker);
@ -320,7 +320,7 @@ namespace Meteor.Map.Actors
} }
else else
{ {
var err = String.Format("[{0}][{1}] {2} {3} {4} {5} tried to die ded", actorId, GetUniqueId(), positionX, positionY, positionZ, GetZone().GetName()); var err = String.Format("[{0}][{1}] {2} {3} {4} {5} tried to die ded", actorId, GetUniqueId(), positionX, positionY, positionZ, CurrentArea.GetName());
Program.Log.Error(err); Program.Log.Error(err);
//throw new Exception(err); //throw new Exception(err);
} }
@ -385,7 +385,7 @@ namespace Meteor.Map.Actors
if (GetMobMod((uint)MobModifier.SpellScript) != 0) if (GetMobMod((uint)MobModifier.SpellScript) != 0)
foreach (var action in actions) foreach (var action in actions)
lua.LuaEngine.CallLuaBattleFunction(this, "onCast", this, zone.FindActorInArea<Character>(action.targetId), ((MagicState)state).GetSpell(), action); lua.LuaEngine.CallLuaBattleFunction(this, "onCast", this, CurrentArea.FindActorInArea<Character>(action.targetId), ((MagicState)state).GetSpell(), action);
} }
public override void OnAbility(State state, CommandResult[] actions, BattleCommand ability, ref CommandResult[] errors) public override void OnAbility(State state, CommandResult[] actions, BattleCommand ability, ref CommandResult[] errors)
@ -405,7 +405,7 @@ namespace Meteor.Map.Actors
if (GetMobMod((uint)MobModifier.WeaponSkillScript) != 0) if (GetMobMod((uint)MobModifier.WeaponSkillScript) != 0)
foreach (var action in actions) foreach (var action in actions)
lua.LuaEngine.CallLuaBattleFunction(this, "onWeaponSkill", this, zone.FindActorInArea<Character>(action.targetId), ((WeaponSkillState)state).GetWeaponSkill(), action); lua.LuaEngine.CallLuaBattleFunction(this, "onWeaponSkill", this, CurrentArea.FindActorInArea<Character>(action.targetId), ((WeaponSkillState)state).GetWeaponSkill(), action);
} }
public override void OnSpawn() public override void OnSpawn()

View file

@ -58,7 +58,7 @@ namespace Meteor.Map.Actors
public NpcSpawnType npcSpawnType; public NpcSpawnType npcSpawnType;
public Npc(int actorNumber, ActorClass actorClass, string uniqueId, Area spawnedArea, float posX, float posY, float posZ, float rot, ushort actorState, uint animationId, string customDisplayName) public Npc(int actorNumber, ActorClass actorClass, string uniqueId, Area spawnedArea, float posX, float posY, float posZ, float rot, ushort actorState, uint animationId, string customDisplayName)
: base((4 << 28 | spawnedArea.actorId << 19 | (uint)actorNumber)) : base((4 << 28 | spawnedArea.actorId << 19 | ((uint)actorNumber + 5)))
{ {
this.positionX = posX; this.positionX = posX;
this.positionY = posY; this.positionY = posY;
@ -72,8 +72,7 @@ namespace Meteor.Map.Actors
this.uniqueIdentifier = uniqueId; this.uniqueIdentifier = uniqueId;
this.zoneId = spawnedArea.actorId; CurrentArea = spawnedArea;
this.zone = spawnedArea;
this.actorClassId = actorClass.actorClassId; this.actorClassId = actorClass.actorClassId;
@ -133,8 +132,7 @@ namespace Meteor.Map.Actors
this.uniqueIdentifier = uniqueId; this.uniqueIdentifier = uniqueId;
this.zoneId = spawnedArea.actorId; CurrentArea = spawnedArea;
this.zone = spawnedArea;
this.actorClassId = actorClass.actorClassId; this.actorClassId = actorClass.actorClassId;
@ -298,7 +296,7 @@ namespace Meteor.Map.Actors
public void ChangeNpcAppearance(uint id) public void ChangeNpcAppearance(uint id)
{ {
LoadNpcAppearance(id); LoadNpcAppearance(id);
zone.BroadcastPacketAroundActor(this, CreateAppearancePacket()); CurrentArea.BroadcastPacketAroundActor(this, CreateAppearancePacket());
} }
public void LoadNpcAppearance(uint id) public void LoadNpcAppearance(uint id)
@ -431,7 +429,7 @@ namespace Meteor.Map.Actors
public void Despawn() public void Despawn()
{ {
zone.DespawnActor(this); CurrentArea.DespawnActor(this);
} }
public override void Update(DateTime tick) public override void Update(DateTime tick)
@ -463,7 +461,7 @@ namespace Meteor.Map.Actors
public override void OnDespawn() public override void OnDespawn()
{ {
zone.BroadcastPacketAroundActor(this, RemoveActorPacket.BuildPacket(this.actorId)); CurrentArea.BroadcastPacketAroundActor(this, RemoveActorPacket.BuildPacket(this.actorId));
QueuePositionUpdate(spawnX, spawnY, spawnZ); QueuePositionUpdate(spawnX, spawnY, spawnZ);
LuaEngine.CallLuaBattleFunction(this, "onDespawn", this); LuaEngine.CallLuaBattleFunction(this, "onDespawn", this);
} }

View file

@ -35,7 +35,7 @@ namespace Meteor.Map.actors.chara.npc
private Player ownerPlayer; private Player ownerPlayer;
public Retainer(uint retainerId, ActorClass actorClass, Player player, float posX, float posY, float posZ, float rot) public Retainer(uint retainerId, ActorClass actorClass, Player player, float posX, float posY, float posZ, float rot)
: base(0, actorClass, "myretainer", player.GetZone(), posX, posY, posZ, rot, 0, 0, null) : base(0, actorClass, "myretainer", player.CurrentArea, posX, posY, posZ, rot, 0, 0, null)
{ {
this.retainerId = retainerId; this.retainerId = retainerId;
this.ownerPlayer = player; this.ownerPlayer = player;

View file

@ -397,7 +397,7 @@ namespace Meteor.Map.Actors
subpackets.Add(SetCurrentMountGoobbuePacket.BuildPacket(actorId, 1)); subpackets.Add(SetCurrentMountGoobbuePacket.BuildPacket(actorId, 1));
//Inn Packets (Dream, Cutscenes, Armoire) //Inn Packets (Dream, Cutscenes, Armoire)
if (zone.isInn) if (CurrentArea.isInn)
{ {
SetCutsceneBookPacket cutsceneBookPacket = new SetCutsceneBookPacket(); SetCutsceneBookPacket cutsceneBookPacket = new SetCutsceneBookPacket();
for (int i = 0; i < 2048; i++) for (int i = 0; i < 2048; i++)
@ -578,7 +578,7 @@ namespace Meteor.Map.Actors
public void SendSeamlessZoneInPackets() public void SendSeamlessZoneInPackets()
{ {
QueuePacket(SetMusicPacket.BuildPacket(actorId, zone.bgmDay, SetMusicPacket.EFFECT_FADEIN)); QueuePacket(SetMusicPacket.BuildPacket(actorId, CurrentArea.bgmDay, SetMusicPacket.EFFECT_FADEIN));
QueuePacket(SetWeatherPacket.BuildPacket(actorId, SetWeatherPacket.WEATHER_CLEAR, 1)); QueuePacket(SetWeatherPacket.BuildPacket(actorId, SetWeatherPacket.WEATHER_CLEAR, 1));
} }
@ -601,11 +601,11 @@ namespace Meteor.Map.Actors
} }
} }
else else
QueuePacket(SetMusicPacket.BuildPacket(actorId, zone.bgmDay, 0x01)); //Zone QueuePacket(SetMusicPacket.BuildPacket(actorId, CurrentArea.bgmDay, 0x01)); //Zone
QueuePacket(SetWeatherPacket.BuildPacket(actorId, SetWeatherPacket.WEATHER_CLEAR, 1)); QueuePacket(SetWeatherPacket.BuildPacket(actorId, SetWeatherPacket.WEATHER_CLEAR, 1));
QueuePacket(SetMapPacket.BuildPacket(actorId, zone.regionId, zone.actorId)); QueuePacket(SetMapPacket.BuildPacket(actorId, CurrentArea.RegionId, CurrentArea.ZoneId));
QueuePackets(GetSpawnPackets(this, spawnType)); QueuePackets(GetSpawnPackets(this, spawnType));
@ -623,7 +623,7 @@ namespace Meteor.Map.Actors
playerSession.QueuePacket(GetInitPackets()); playerSession.QueuePacket(GetInitPackets());
List<SubPacket> areaMasterSpawn = zone.GetSpawnPackets(); List<SubPacket> areaMasterSpawn = CurrentArea.GetSpawnPackets();
List<SubPacket> debugSpawn = world.GetDebugActor().GetSpawnPackets(); List<SubPacket> debugSpawn = world.GetDebugActor().GetSpawnPackets();
List<SubPacket> worldMasterSpawn = world.GetActor().GetSpawnPackets(); List<SubPacket> worldMasterSpawn = world.GetActor().GetSpawnPackets();
@ -631,9 +631,9 @@ namespace Meteor.Map.Actors
playerSession.QueuePacket(debugSpawn); playerSession.QueuePacket(debugSpawn);
playerSession.QueuePacket(worldMasterSpawn); playerSession.QueuePacket(worldMasterSpawn);
if (zone.GetWeatherDirector() != null) if (CurrentArea.GetWeatherDirector() != null)
{ {
playerSession.QueuePacket(zone.GetWeatherDirector().GetSpawnPackets()); playerSession.QueuePacket(CurrentArea.GetWeatherDirector().GetSpawnPackets());
} }
foreach (Director director in ownedDirectors) foreach (Director director in ownedDirectors)
@ -758,7 +758,7 @@ namespace Meteor.Map.Actors
public void ChangeAnimation(uint animId) public void ChangeAnimation(uint animId)
{ {
Actor a = zone.FindActorInArea(currentTarget); Actor a = CurrentArea.FindActorInArea(currentTarget);
if (a is Npc) if (a is Npc)
((Npc)a).animationId = animId; ((Npc)a).animationId = animId;
} }
@ -783,7 +783,7 @@ namespace Meteor.Map.Actors
playerSession.LockUpdates(true); playerSession.LockUpdates(true);
//Remove actor from zone and main server list //Remove actor from zone and main server list
zone.RemoveActorFromZone(this); CurrentArea.RemoveActorFromZone(this);
//Set Destination to 0 //Set Destination to 0
this.destinationZone = 0; this.destinationZone = 0;
@ -810,7 +810,7 @@ namespace Meteor.Map.Actors
playerSession.LockUpdates(true); playerSession.LockUpdates(true);
//Remove actor from zone and main server list //Remove actor from zone and main server list
zone.RemoveActorFromZone(this); CurrentArea.RemoveActorFromZone(this);
//Clean up parties //Clean up parties
RemoveFromCurrentPartyAndCleanup(); RemoveFromCurrentPartyAndCleanup();
@ -831,11 +831,6 @@ namespace Meteor.Map.Actors
Database.SavePlayerStatusEffects(this); Database.SavePlayerStatusEffects(this);
} }
public Area GetZone()
{
return zone;
}
public void SendMessage(uint logType, string sender, string message) public void SendMessage(uint logType, string sender, string message)
{ {
QueuePacket(SendMessagePacket.BuildPacket(actorId, logType, sender, message)); QueuePacket(SendMessagePacket.BuildPacket(actorId, logType, sender, message));
@ -844,7 +839,7 @@ namespace Meteor.Map.Actors
//Only use at logout since it's intensive //Only use at logout since it's intensive
private byte GetInnCode() private byte GetInnCode()
{ {
if (zone.isInn) if (CurrentArea.isInn)
{ {
Vector3 position = new Vector3(positionX, 0, positionZ); Vector3 position = new Vector3(positionX, 0, positionZ);
if (Utils.Distance(position, new Vector3(0, 0, 0)) <= 20f) if (Utils.Distance(position, new Vector3(0, 0, 0)) <= 20f)
@ -989,7 +984,7 @@ namespace Meteor.Map.Actors
public void BroadcastWorldMessage(ushort worldMasterId, params object[] msgParams) public void BroadcastWorldMessage(ushort worldMasterId, params object[] msgParams)
{ {
//SubPacket worldMasterMessage = //SubPacket worldMasterMessage =
//zone.BroadcastPacketAroundActor(this, worldMasterMessage); //CurrentArea.BroadcastPacketAroundActor(this, worldMasterMessage);
} }
public void GraphicChange(uint slot, uint graphicId) public void GraphicChange(uint slot, uint graphicId)
@ -1677,7 +1672,7 @@ namespace Meteor.Map.Actors
{ {
Quest defaultTalk = null; Quest defaultTalk = null;
switch (npc.zone.regionId) switch (npc.CurrentArea.RegionId)
{ {
case 101: case 101:
defaultTalk = (Quest) Server.GetStaticActors("DftSea"); defaultTalk = (Quest) Server.GetStaticActors("DftSea");
@ -1971,8 +1966,8 @@ namespace Meteor.Map.Actors
//Update Instance //Update Instance
List<Actor> aroundMe = new List<Actor>(); List<Actor> aroundMe = new List<Actor>();
if (zone != null) if (CurrentArea != null)
aroundMe.AddRange(zone.GetActorsAroundActor(this, 50)); aroundMe.AddRange(CurrentArea.GetActorsAroundActor(this, 50));
if (zone2 != null) if (zone2 != null)
aroundMe.AddRange(zone2.GetActorsAroundActor(this, 50)); aroundMe.AddRange(zone2.GetActorsAroundActor(this, 50));
playerSession.UpdateInstance(aroundMe, force); playerSession.UpdateInstance(aroundMe, force);
@ -2137,7 +2132,7 @@ namespace Meteor.Map.Actors
{ {
rentalExpireTime = 0; rentalExpireTime = 0;
rentalMinLeft = 0; rentalMinLeft = 0;
ChangeMusic(GetZone().bgmDay); ChangeMusic(CurrentArea.bgmDay);
SetMountState(0); SetMountState(0);
ChangeSpeed(0.0f, 2.0f, 5.0f, 5.0f); ChangeSpeed(0.0f, 2.0f, 5.0f, 5.0f);
ChangeState(0); ChangeState(0);
@ -2400,7 +2395,7 @@ namespace Meteor.Map.Actors
public override void Cast(uint spellId, uint targetId = 0) public override void Cast(uint spellId, uint targetId = 0)
{ {
if (aiContainer.CanChangeState()) if (aiContainer.CanChangeState())
aiContainer.Cast(zone.FindActorInArea<Character>(targetId == 0 ? currentTarget : targetId), spellId); aiContainer.Cast(CurrentArea.FindActorInArea<Character>(targetId == 0 ? currentTarget : targetId), spellId);
else if (aiContainer.IsCurrentState<MagicState>()) else if (aiContainer.IsCurrentState<MagicState>())
// You are already casting. // You are already casting.
SendGameMessage(Server.GetWorldManager().GetActor(), 32536, 0x20); SendGameMessage(Server.GetWorldManager().GetActor(), 32536, 0x20);
@ -2412,7 +2407,7 @@ namespace Meteor.Map.Actors
public override void Ability(uint abilityId, uint targetId = 0) public override void Ability(uint abilityId, uint targetId = 0)
{ {
if (aiContainer.CanChangeState()) if (aiContainer.CanChangeState())
aiContainer.Ability(zone.FindActorInArea<Character>(targetId == 0 ? currentTarget : targetId), abilityId); aiContainer.Ability(CurrentArea.FindActorInArea<Character>(targetId == 0 ? currentTarget : targetId), abilityId);
else else
// Please wait a moment and try again. // Please wait a moment and try again.
SendGameMessage(Server.GetWorldManager().GetActor(), 32535, 0x20); SendGameMessage(Server.GetWorldManager().GetActor(), 32535, 0x20);
@ -2421,7 +2416,7 @@ namespace Meteor.Map.Actors
public override void WeaponSkill(uint skillId, uint targetId = 0) public override void WeaponSkill(uint skillId, uint targetId = 0)
{ {
if (aiContainer.CanChangeState()) if (aiContainer.CanChangeState())
aiContainer.WeaponSkill(zone.FindActorInArea<Character>(targetId == 0 ? currentTarget : targetId), skillId); aiContainer.WeaponSkill(CurrentArea.FindActorInArea<Character>(targetId == 0 ? currentTarget : targetId), skillId);
else else
// Please wait a moment and try again. // Please wait a moment and try again.
SendGameMessage(Server.GetWorldManager().GetActor(), 32535, 0x20); SendGameMessage(Server.GetWorldManager().GetActor(), 32535, 0x20);

View file

@ -46,11 +46,10 @@ namespace Meteor.Map.actors.director
private Coroutine currentCoroutine; private Coroutine currentCoroutine;
public Director(uint id, Area zone, string directorPath, bool hasContentGroup, params object[] args) public Director(uint id, Area zone, string directorPath, bool hasContentGroup, params object[] args)
: base((6 << 28 | zone.actorId << 19 | (uint)id)) : base((6 << 28 | zone.CurrentArea.ZoneId << 19 | (uint)id))
{ {
directorId = id; directorId = id;
this.zone = zone; CurrentArea = zone;
this.zoneId = zone.actorId;
directorScriptPath = directorPath; directorScriptPath = directorPath;
LoadLuaScript(); LoadLuaScript();
@ -172,7 +171,7 @@ namespace Meteor.Map.actors.director
((Player)player).RemoveDirector(this); ((Player)player).RemoveDirector(this);
members.Clear(); members.Clear();
isDeleted = true; isDeleted = true;
Server.GetWorldManager().GetZone(zoneId).DeleteDirector(actorId); Server.GetWorldManager().GetArea(CurrentArea.ZoneId).DeleteDirector(actorId);
} }
public void AddMember(Actor actor) public void AddMember(Actor actor)
@ -242,7 +241,7 @@ namespace Meteor.Map.actors.director
className = Char.ToLowerInvariant(className[0]) + className.Substring(1); className = Char.ToLowerInvariant(className[0]) + className.Substring(1);
//Format Zone Name //Format Zone Name
string zoneName = zone.zoneName.Replace("Field", "Fld") string zoneName = CurrentArea.ZoneName.Replace("Field", "Fld")
.Replace("Dungeon", "Dgn") .Replace("Dungeon", "Dgn")
.Replace("Town", "Twn") .Replace("Town", "Twn")
.Replace("Battle", "Btl") .Replace("Battle", "Btl")
@ -250,7 +249,7 @@ namespace Meteor.Map.actors.director
.Replace("Event", "Evt") .Replace("Event", "Evt")
.Replace("Ship", "Shp") .Replace("Ship", "Shp")
.Replace("Office", "Ofc"); .Replace("Office", "Ofc");
if (zone is PrivateArea) if (CurrentArea is PrivateArea)
{ {
//Check if "normal" //Check if "normal"
zoneName = zoneName.Remove(zoneName.Length - 1, 1) + "P"; zoneName = zoneName.Remove(zoneName.Length - 1, 1) + "P";
@ -268,10 +267,8 @@ namespace Meteor.Map.actors.director
string classNumber = Utils.ToStringBase63(actorNumber); string classNumber = Utils.ToStringBase63(actorNumber);
//Get stuff after @ //Get stuff after @
uint zoneId = zone.actorId; uint zoneId = CurrentArea.ZoneId;
uint privLevel = 0; int privLevel = CurrentArea.GetPrivateAreaType();
if (zone is PrivateArea)
privLevel = ((PrivateArea)zone).GetPrivateAreaType();
actorName = String.Format("{0}_{1}_{2}@{3:X3}{4:X2}", className, zoneName, classNumber, zoneId, privLevel); actorName = String.Format("{0}_{1}_{2}@{3:X3}{4:X2}", className, zoneName, classNumber, zoneId, privLevel);
} }

View file

@ -137,7 +137,7 @@ namespace Meteor.Map.actors.director
if (wasCompleted) if (wasCompleted)
{ {
Npc aetheryteNode = zone.SpawnActor(1200040, String.Format("{0}:warpExit", guildleveOwner.actorName), guildleveOwner.positionX, guildleveOwner.positionY, guildleveOwner.positionZ); Npc aetheryteNode = CurrentArea.SpawnActor(1200040, String.Format("{0}:warpExit", guildleveOwner.actorName), guildleveOwner.positionX, guildleveOwner.positionY, guildleveOwner.positionZ);
AddMember(aetheryteNode); AddMember(aetheryteNode);
foreach (Actor a in GetPlayerMembers()) foreach (Actor a in GetPlayerMembers())
@ -168,7 +168,7 @@ namespace Meteor.Map.actors.director
foreach (Actor p in GetPlayerMembers()) foreach (Actor p in GetPlayerMembers())
{ {
Player player = (Player)p; Player player = (Player)p;
player.ChangeMusic(player.GetZone().bgmDay); player.ChangeMusic(player.CurrentArea.bgmDay);
} }
} }

View file

@ -119,26 +119,26 @@ namespace Meteor.Map.actors.group
ulong time = Utils.MilisUnixTimeStampUTC(); ulong time = Utils.MilisUnixTimeStampUTC();
List<GroupMember> members = BuildMemberList(session.id); List<GroupMember> members = BuildMemberList(session.id);
session.QueuePacket(GroupHeaderPacket.buildPacket(session.id, session.GetActor().zoneId, time, this)); session.QueuePacket(GroupHeaderPacket.buildPacket(session.id, session.GetActor().CurrentArea.ZoneId, time, this));
session.QueuePacket(GroupMembersBeginPacket.buildPacket(session.id, session.GetActor().zoneId, time, this)); session.QueuePacket(GroupMembersBeginPacket.buildPacket(session.id, session.GetActor().CurrentArea.ZoneId, time, this));
int currentIndex = 0; int currentIndex = 0;
while (true) while (true)
{ {
if (GetMemberCount() - currentIndex >= 64) if (GetMemberCount() - currentIndex >= 64)
session.QueuePacket(ContentMembersX64Packet.buildPacket(session.id, session.GetActor().zoneId, time, members, ref currentIndex)); session.QueuePacket(ContentMembersX64Packet.buildPacket(session.id, session.GetActor().CurrentArea.ZoneId, time, members, ref currentIndex));
else if (GetMemberCount() - currentIndex >= 32) else if (GetMemberCount() - currentIndex >= 32)
session.QueuePacket(ContentMembersX32Packet.buildPacket(session.id, session.GetActor().zoneId, time, members, ref currentIndex)); session.QueuePacket(ContentMembersX32Packet.buildPacket(session.id, session.GetActor().CurrentArea.ZoneId, time, members, ref currentIndex));
else if (GetMemberCount() - currentIndex >= 16) else if (GetMemberCount() - currentIndex >= 16)
session.QueuePacket(ContentMembersX16Packet.buildPacket(session.id, session.GetActor().zoneId, time, members, ref currentIndex)); session.QueuePacket(ContentMembersX16Packet.buildPacket(session.id, session.GetActor().CurrentArea.ZoneId, time, members, ref currentIndex));
else if (GetMemberCount() - currentIndex > 0) else if (GetMemberCount() - currentIndex > 0)
session.QueuePacket(ContentMembersX08Packet.buildPacket(session.id, session.GetActor().zoneId, time, members, ref currentIndex)); session.QueuePacket(ContentMembersX08Packet.buildPacket(session.id, session.GetActor().CurrentArea.ZoneId, time, members, ref currentIndex));
else else
break; break;
} }
session.QueuePacket(GroupMembersEndPacket.buildPacket(session.id, session.GetActor().zoneId, time, this)); session.QueuePacket(GroupMembersEndPacket.buildPacket(session.id, session.GetActor().CurrentArea.ZoneId, time, this));
} }
public override uint GetTypeId() public override uint GetTypeId()
@ -160,7 +160,7 @@ namespace Meteor.Map.actors.group
Session s = Server.GetServer().GetSession(members[i]); Session s = Server.GetServer().GetSession(members[i]);
if (s != null) if (s != null)
s.GetActor().SetCurrentContentGroup(null); s.GetActor().SetCurrentContentGroup(null);
Actor a = director.GetZone().FindActorInArea(members[i]); Actor a = director.CurrentArea.FindActorInArea(members[i]);
if (a is Npc) if (a is Npc)
((Npc)a).Despawn(); ((Npc)a).Despawn();
members.Remove(members[i]); members.Remove(members[i]);

View file

@ -141,8 +141,8 @@ namespace Meteor.Map.actors.group
ulong time = Utils.MilisUnixTimeStampUTC(); ulong time = Utils.MilisUnixTimeStampUTC();
List<GroupMember> members = BuildMemberList(session.id); List<GroupMember> members = BuildMemberList(session.id);
session.QueuePacket(GroupHeaderPacket.buildPacket(session.id, session.GetActor().zoneId, time, this)); session.QueuePacket(GroupHeaderPacket.buildPacket(session.id, session.GetActor().CurrentArea.ZoneId, time, this));
session.QueuePacket(GroupMembersBeginPacket.buildPacket(session.id, session.GetActor().zoneId, time, this)); session.QueuePacket(GroupMembersBeginPacket.buildPacket(session.id, session.GetActor().CurrentArea.ZoneId, time, this));
int currentIndex = 0; int currentIndex = 0;
@ -150,18 +150,18 @@ namespace Meteor.Map.actors.group
{ {
int memberCount = Math.Min(GetMemberCount(), members.Count); int memberCount = Math.Min(GetMemberCount(), members.Count);
if (memberCount - currentIndex >= 64) if (memberCount - currentIndex >= 64)
session.QueuePacket(GroupMembersX64Packet.buildPacket(session.id, session.GetActor().zoneId, time, members, ref currentIndex)); session.QueuePacket(GroupMembersX64Packet.buildPacket(session.id, session.GetActor().CurrentArea.ZoneId, time, members, ref currentIndex));
else if (memberCount - currentIndex >= 32) else if (memberCount - currentIndex >= 32)
session.QueuePacket(GroupMembersX32Packet.buildPacket(session.id, session.GetActor().zoneId, time, members, ref currentIndex)); session.QueuePacket(GroupMembersX32Packet.buildPacket(session.id, session.GetActor().CurrentArea.ZoneId, time, members, ref currentIndex));
else if (memberCount - currentIndex >= 16) else if (memberCount - currentIndex >= 16)
session.QueuePacket(GroupMembersX16Packet.buildPacket(session.id, session.GetActor().zoneId, time, members, ref currentIndex)); session.QueuePacket(GroupMembersX16Packet.buildPacket(session.id, session.GetActor().CurrentArea.ZoneId, time, members, ref currentIndex));
else if (memberCount - currentIndex > 0) else if (memberCount - currentIndex > 0)
session.QueuePacket(GroupMembersX08Packet.buildPacket(session.id, session.GetActor().zoneId, time, members, ref currentIndex)); session.QueuePacket(GroupMembersX08Packet.buildPacket(session.id, session.GetActor().CurrentArea.ZoneId, time, members, ref currentIndex));
else else
break; break;
} }
session.QueuePacket(GroupMembersEndPacket.buildPacket(session.id, session.GetActor().zoneId, time, this)); session.QueuePacket(GroupMembersEndPacket.buildPacket(session.id, session.GetActor().CurrentArea.ZoneId, time, this));
} }

View file

@ -388,9 +388,9 @@ namespace Meteor.Map
cmd.Parameters.AddWithValue("@y", player.positionY); cmd.Parameters.AddWithValue("@y", player.positionY);
cmd.Parameters.AddWithValue("@z", player.positionZ); cmd.Parameters.AddWithValue("@z", player.positionZ);
cmd.Parameters.AddWithValue("@rot", player.rotation); cmd.Parameters.AddWithValue("@rot", player.rotation);
cmd.Parameters.AddWithValue("@zoneId", player.zoneId); cmd.Parameters.AddWithValue("@zoneId", player.CurrentArea.ZoneId);
cmd.Parameters.AddWithValue("@privateArea", player.privateArea); cmd.Parameters.AddWithValue("@privateArea", player.CurrentArea.GetPrivateAreaName());
cmd.Parameters.AddWithValue("@privateAreaType", player.privateAreaType); cmd.Parameters.AddWithValue("@privateAreaType", player.CurrentArea.GetPrivateAreaType());
cmd.Parameters.AddWithValue("@destZone", player.destinationZone); cmd.Parameters.AddWithValue("@destZone", player.destinationZone);
cmd.Parameters.AddWithValue("@destSpawn", player.destinationSpawnType); cmd.Parameters.AddWithValue("@destSpawn", player.destinationSpawnType);
@ -783,15 +783,19 @@ namespace Meteor.Map
{ {
if (reader.Read()) if (reader.Read())
{ {
player.displayNameId = 0xFFFFFFFF; uint zoneId;
string privateAreaName = null;
int privateAreaType;
player.displayNameId = -1;
player.customDisplayName = reader.GetString(0); player.customDisplayName = reader.GetString(0);
player.oldPositionX = player.positionX = reader.GetFloat(1); player.oldPositionX = player.positionX = reader.GetFloat(1);
player.oldPositionY = player.positionY = reader.GetFloat(2); player.oldPositionY = player.positionY = reader.GetFloat(2);
player.oldPositionZ = player.positionZ = reader.GetFloat(3); player.oldPositionZ = player.positionZ = reader.GetFloat(3);
player.oldRotation = player.rotation = reader.GetFloat(4); player.oldRotation = player.rotation = reader.GetFloat(4);
player.currentMainState = reader.GetUInt16(5); player.currentMainState = reader.GetUInt16(5);
player.zoneId = reader.GetUInt32(6); player.IsZoneing = true;
player.isZoning = true;
player.gcCurrent = reader.GetByte(7); player.gcCurrent = reader.GetByte(7);
player.gcRankLimsa = reader.GetByte(8); player.gcRankLimsa = reader.GetByte(8);
player.gcRankGridania = reader.GetByte(9); player.gcRankGridania = reader.GetByte(9);
@ -810,17 +814,14 @@ namespace Meteor.Map
player.destinationZone = reader.GetUInt32("destinationZoneId"); player.destinationZone = reader.GetUInt32("destinationZoneId");
player.destinationSpawnType = reader.GetByte("destinationSpawnType"); player.destinationSpawnType = reader.GetByte("destinationSpawnType");
if (!reader.IsDBNull(reader.GetOrdinal("currentPrivateArea"))) // Get the area the player is in
player.privateArea = reader.GetString("currentPrivateArea"); zoneId = reader.GetUInt32(6);
player.privateAreaType = reader.GetUInt32("currentPrivateAreaType");
if (player.destinationZone != 0) if (player.destinationZone != 0)
player.zoneId = player.destinationZone; zoneId = player.destinationZone;
if (!reader.IsDBNull(reader.GetOrdinal("currentPrivateArea")))
if (player.privateArea != null && !player.privateArea.Equals("")) privateAreaName = reader.GetString("currentPrivateArea");
player.zone = Server.GetWorldManager().GetPrivateArea(player.zoneId, player.privateArea, player.privateAreaType); privateAreaType = reader.GetInt32("currentPrivateAreaType");
else player.CurrentArea = Server.GetWorldManager().GetArea(zoneId, privateAreaName, privateAreaType);
player.zone = Server.GetWorldManager().GetZone(player.zoneId);
} }
} }

View file

@ -38,6 +38,7 @@ using System.Threading;
using Meteor.Map.actors.chara.ai; using Meteor.Map.actors.chara.ai;
using Meteor.Map.actors.chara.ai.controllers; using Meteor.Map.actors.chara.ai.controllers;
using Meteor.Map.DataObjects; using Meteor.Map.DataObjects;
using Meteor.Map.actors.chara.player;
namespace Meteor.Map.lua namespace Meteor.Map.lua
{ {
@ -64,17 +65,23 @@ namespace Meteor.Map.lua
luaTimer = new Timer(new TimerCallback(PulseSleepingOnTime), luaTimer = new Timer(new TimerCallback(PulseSleepingOnTime),
null, TimeSpan.Zero, TimeSpan.FromMilliseconds(50)); null, TimeSpan.Zero, TimeSpan.FromMilliseconds(50));
UserData.RegistrationPolicy = InteropRegistrationPolicy.Automatic;
/*
UserData.RegisterType<LuaEngine>(); UserData.RegisterType<LuaEngine>();
UserData.RegisterType<Player>(); UserData.RegisterType<Player>();
UserData.RegisterType<Command>(); UserData.RegisterType<Command>();
UserData.RegisterType<Npc>(); UserData.RegisterType<Npc>();
UserData.RegisterType<Quest>(); UserData.RegisterType<Quest>();
UserData.RegisterType<Zone>(); UserData.RegisterType<Zone>();
UserData.RegisterType<InventoryItem>();
UserData.RegisterType<ItemPackage>();
UserData.RegisterType<PrivateArea>(); UserData.RegisterType<PrivateArea>();
UserData.RegisterType<PrivateAreaContent>(); UserData.RegisterType<PrivateAreaContent>();
UserData.RegisterType<Director>(); UserData.RegisterType<Director>();
UserData.RegisterType<WorldManager>(); UserData.RegisterType<WorldManager>();
UserData.RegisterType<WorldMaster>(); UserData.RegisterType<WorldMaster>();
*/
} }
public static LuaEngine GetInstance() public static LuaEngine GetInstance()
@ -180,7 +187,7 @@ namespace Meteor.Map.lua
{ {
// todo: this is probably unnecessary as im not sure there were pets for players // todo: this is probably unnecessary as im not sure there were pets for players
if (!(actor.aiContainer.GetController<PetController>()?.GetPetMaster() is Player)) if (!(actor.aiContainer.GetController<PetController>()?.GetPetMaster() is Player))
path = String.Format($"{ConfigConstants.OPTIONS_SCRIPTPATH}/unique/{0}/{1}/{2}.lua", actor.zone.zoneName, actor is BattleNpc ? "Monster" : "PopulaceStandard", ((Npc)actor).GetUniqueId()); path = String.Format($"{ConfigConstants.OPTIONS_SCRIPTPATH}/unique/{0}/{1}/{2}.lua", actor.CurrentArea.ZoneName, actor is BattleNpc ? "Monster" : "PopulaceStandard", ((Npc)actor).GetUniqueId());
} }
// dont wanna throw an error if file doesnt exist // dont wanna throw an error if file doesnt exist
if (File.Exists(path)) if (File.Exists(path))
@ -389,7 +396,7 @@ namespace Meteor.Map.lua
} }
else if (target is Area) else if (target is Area)
{ {
return root + String.Format(FILEPATH_ZONE, ((Area)target).zoneName); return root + String.Format(FILEPATH_ZONE, ((Area)target).ZoneName);
} }
else if (target is Quest) else if (target is Quest)
{ {
@ -422,21 +429,23 @@ namespace Meteor.Map.lua
if (!errorMsg.Equals("")) if (!errorMsg.Equals(""))
SendError(player, errorMsg); SendError(player, errorMsg);
Area area = target.zone; Area area = target.CurrentArea;
if (area is PrivateArea) if (area is PrivateArea)
{ {
if (File.Exists(String.Format($"{ConfigConstants.OPTIONS_SCRIPTPATH}/unique/{0}/privatearea/{1}_{2}/{3}/{4}.lua", area.zoneName, ((PrivateArea)area).GetPrivateAreaName(), ((PrivateArea)area).GetPrivateAreaType(), target.className, target.GetUniqueId()))) string path = $"{ConfigConstants.OPTIONS_SCRIPTPATH}/unique/{area.ZoneName}/privatearea/{((PrivateArea)area).GetPrivateAreaName()}_{((PrivateArea)area).GetPrivateAreaType()}/{target.className}/{target.GetUniqueId()}.lua";
child = LuaEngine.LoadScript(String.Format($"{ConfigConstants.OPTIONS_SCRIPTPATH}/unique/{0}/privatearea/{1}_{2}/{3}/{4}.lua", area.zoneName, ((PrivateArea)area).GetPrivateAreaName(), ((PrivateArea)area).GetPrivateAreaType(), target.className, target.GetUniqueId()), ref errorMsg); if (File.Exists(path))
child = LuaEngine.LoadScript(path, ref errorMsg);
} }
else else
{ {
if (File.Exists(String.Format($"{ConfigConstants.OPTIONS_SCRIPTPATH}/unique/{0}/{1}/{2}.lua", area.zoneName, target.className, target.GetUniqueId()))) string path = $"{ConfigConstants.OPTIONS_SCRIPTPATH}/unique/{area.ZoneName}/{target.className}/{target.GetUniqueId()}.lua";
child = LuaEngine.LoadScript(String.Format($"{ConfigConstants.OPTIONS_SCRIPTPATH}/unique/{0}/{1}/{2}.lua", area.zoneName, target.className, target.GetUniqueId()), ref errorMsg); if (File.Exists(path))
child = LuaEngine.LoadScript(path, ref errorMsg);
} }
if (parent == null && child == null) if (parent == null && child == null)
{ {
LuaEngine.SendError(player, String.Format("ERROR: Could not find script for actor {0}.", target.GetName())); LuaEngine.SendError(player, $"ERROR: Could not find script for actor {target.GetName()}.");
} }
//Run Script //Run Script
@ -471,16 +480,16 @@ namespace Meteor.Map.lua
if (File.Exists($"{ConfigConstants.OPTIONS_SCRIPTPATH}/base/" + target.classPath + ".lua")) if (File.Exists($"{ConfigConstants.OPTIONS_SCRIPTPATH}/base/" + target.classPath + ".lua"))
parent = LuaEngine.LoadScript($"{ConfigConstants.OPTIONS_SCRIPTPATH}/base/" + target.classPath + ".lua", ref errorMsg); parent = LuaEngine.LoadScript($"{ConfigConstants.OPTIONS_SCRIPTPATH}/base/" + target.classPath + ".lua", ref errorMsg);
Area area = target.zone; Area area = target.CurrentArea;
if (area is PrivateArea) if (area is PrivateArea)
{ {
if (File.Exists(String.Format($"{ConfigConstants.OPTIONS_SCRIPTPATH}/unique/{0}/privatearea/{1}_{2}/{3}/{4}.lua", area.zoneName, ((PrivateArea)area).GetPrivateAreaName(), ((PrivateArea)area).GetPrivateAreaType(), target.className, target.GetUniqueId()))) if (File.Exists(String.Format($"{ConfigConstants.OPTIONS_SCRIPTPATH}/unique/{0}/privatearea/{1}_{2}/{3}/{4}.lua", area.ZoneName, ((PrivateArea)area).GetPrivateAreaName(), ((PrivateArea)area).GetPrivateAreaType(), target.className, target.GetUniqueId())))
child = LuaEngine.LoadScript(String.Format($"{ConfigConstants.OPTIONS_SCRIPTPATH}/unique/{0}/privatearea/{1}_{2}/{3}/{4}.lua", area.zoneName, ((PrivateArea)area).GetPrivateAreaName(), ((PrivateArea)area).GetPrivateAreaType(), target.className, target.GetUniqueId()), ref errorMsg); child = LuaEngine.LoadScript(String.Format($"{ConfigConstants.OPTIONS_SCRIPTPATH}/unique/{0}/privatearea/{1}_{2}/{3}/{4}.lua", area.ZoneName, ((PrivateArea)area).GetPrivateAreaName(), ((PrivateArea)area).GetPrivateAreaType(), target.className, target.GetUniqueId()), ref errorMsg);
} }
else else
{ {
if (File.Exists(String.Format($"{ConfigConstants.OPTIONS_SCRIPTPATH}/unique/{0}/{1}/{2}.lua", area.zoneName, target.className, target.GetUniqueId()))) if (File.Exists(String.Format($"{ConfigConstants.OPTIONS_SCRIPTPATH}/unique/{0}/{1}/{2}.lua", area.ZoneName, target.className, target.GetUniqueId())))
child = LuaEngine.LoadScript(String.Format($"{ConfigConstants.OPTIONS_SCRIPTPATH}/unique/{0}/{1}/{2}.lua", area.zoneName, target.className, target.GetUniqueId()), ref errorMsg); child = LuaEngine.LoadScript(String.Format($"{ConfigConstants.OPTIONS_SCRIPTPATH}/unique/{0}/{1}/{2}.lua", area.ZoneName, target.className, target.GetUniqueId()), ref errorMsg);
} }
if (parent == null && child == null) if (parent == null && child == null)

View file

@ -206,7 +206,7 @@ namespace Meteor.Map
ownerActor = session.GetActor().currentSpawnedRetainer; ownerActor = session.GetActor().currentSpawnedRetainer;
//Is it a instance actor? //Is it a instance actor?
if (ownerActor == null) if (ownerActor == null)
ownerActor = session.GetActor().zone.FindActorInArea(eventStart.ownerActorID); ownerActor = session.GetActor().CurrentArea.FindActorInArea(eventStart.ownerActorID);
//Is it a Director? //Is it a Director?
if (ownerActor == null) if (ownerActor == null)
{ {

View file

@ -40,9 +40,10 @@ namespace Meteor.Map.packets.send.actor.events
{ {
using (BinaryWriter binWriter = new BinaryWriter(mem)) using (BinaryWriter binWriter = new BinaryWriter(mem))
{ {
binWriter.Write((Byte)condition.unknown1); //4 binWriter.Write((Byte)4); //Id type? Priority
binWriter.Write((UInt16)condition.emoteId); //82, 76, 6E binWriter.Write((Byte)condition.unknown2);
binWriter.Write(Encoding.ASCII.GetBytes(condition.conditionName), 0, Encoding.ASCII.GetByteCount(condition.conditionName) >= 0x24 ? 0x24 : Encoding.ASCII.GetByteCount(condition.conditionName)); binWriter.Write((UInt16)condition.emoteId); //82, 76, 6E are emotes used in captures
binWriter.Write(Encoding.ASCII.GetBytes(condition.conditionName), 0, Encoding.ASCII.GetByteCount(condition.conditionName) >= 0x20 ? 0x20 : Encoding.ASCII.GetByteCount(condition.conditionName));
} }
} }

View file

@ -43,7 +43,7 @@ namespace Meteor.Map.packets.send.actor.events
{ {
binWriter.Write((Byte)condition.unknown1); //Seen: 0, 1, E binWriter.Write((Byte)condition.unknown1); //Seen: 0, 1, E
binWriter.Write((Byte)condition.unknown2); //Seen: 0, 1 binWriter.Write((Byte)condition.unknown2); //Seen: 0, 1
binWriter.Write(Encoding.ASCII.GetBytes(condition.conditionName), 0, Encoding.ASCII.GetByteCount(condition.conditionName) >= 0x24 ? 0x24 : Encoding.ASCII.GetByteCount(condition.conditionName)); binWriter.Write(Encoding.ASCII.GetBytes(condition.conditionName), 0, Encoding.ASCII.GetByteCount(condition.conditionName) >= 0x20 ? 0x20 : Encoding.ASCII.GetByteCount(condition.conditionName));
} }
} }

View file

@ -32,7 +32,7 @@ namespace Meteor.Map.packets.send.actor
public const ushort OPCODE = 0x013D; public const ushort OPCODE = 0x013D;
public const uint PACKET_SIZE = 0x48; public const uint PACKET_SIZE = 0x48;
public static SubPacket BuildPacket(uint sourceActorId, uint displayNameID, string customName, bool isSexMale = true) public static SubPacket BuildPacket(uint sourceActorId, int displayNameID, string customName, bool isSexMale = true)
{ {
byte[] data = new byte[PACKET_SIZE - 0x20]; byte[] data = new byte[PACKET_SIZE - 0x20];
@ -42,7 +42,7 @@ namespace Meteor.Map.packets.send.actor
{ {
binWriter.Write((UInt32)displayNameID); binWriter.Write((UInt32)displayNameID);
if (customName != null && (displayNameID == 0 || displayNameID == 0xFFFFFFFF)) if (customName != null && (displayNameID == 0 || displayNameID == -1))
{ {
binWriter.Write(Encoding.ASCII.GetBytes(customName), 0, Encoding.ASCII.GetByteCount(customName) >= 0x20 ? 0x19 : Encoding.ASCII.GetByteCount(customName)); binWriter.Write(Encoding.ASCII.GetBytes(customName), 0, Encoding.ASCII.GetByteCount(customName) >= 0x20 ? 0x19 : Encoding.ASCII.GetByteCount(customName));

View file

@ -30,7 +30,7 @@ namespace Meteor.Map.packets.send
public const ushort OPCODE = 0x0005; public const ushort OPCODE = 0x0005;
public const uint PACKET_SIZE = 0x30; public const uint PACKET_SIZE = 0x30;
public static SubPacket BuildPacket(uint playerActorID, uint mapID, uint regionID) public static SubPacket BuildPacket(uint playerActorID, uint regionId, uint placeId)
{ {
byte[] data = new byte[PACKET_SIZE - 0x20]; byte[] data = new byte[PACKET_SIZE - 0x20];
@ -38,8 +38,8 @@ namespace Meteor.Map.packets.send
{ {
using (BinaryWriter binWriter = new BinaryWriter(mem)) using (BinaryWriter binWriter = new BinaryWriter(mem))
{ {
binWriter.Write((uint)mapID); binWriter.Write((uint)regionId);
binWriter.Write((uint)regionID); binWriter.Write((uint)placeId);
binWriter.Write((uint)0x28); binWriter.Write((uint)0x28);
} }
} }

View file

@ -69,7 +69,6 @@ namespace Meteor.Map
mWorldManager = new WorldManager(this); mWorldManager = new WorldManager(this);
mWorldManager.LoadZoneList(); mWorldManager.LoadZoneList();
mWorldManager.LoadZoneEntranceList();
mWorldManager.LoadSeamlessBoundryList(); mWorldManager.LoadSeamlessBoundryList();
mWorldManager.LoadActorClasses(); mWorldManager.LoadActorClasses();
mWorldManager.LoadSpawnLocations(); mWorldManager.LoadSpawnLocations();

View file

@ -49,7 +49,6 @@ namespace Meteor.Map
private WorldMaster worldMaster = new WorldMaster(); private WorldMaster worldMaster = new WorldMaster();
private Dictionary<uint, Zone> zoneList; private Dictionary<uint, Zone> zoneList;
private Dictionary<uint, List<SeamlessBoundry>> seamlessBoundryList; private Dictionary<uint, List<SeamlessBoundry>> seamlessBoundryList;
private Dictionary<uint, ZoneEntrance> zoneEntranceList;
private Dictionary<uint, ActorClass> actorClasses = new Dictionary<uint,ActorClass>(); private Dictionary<uint, ActorClass> actorClasses = new Dictionary<uint,ActorClass>();
private Dictionary<ulong, Party> currentPlayerParties = new Dictionary<ulong, Party>(); //GroupId, Party object private Dictionary<ulong, Party> currentPlayerParties = new Dictionary<ulong, Party>(); //GroupId, Party object
private Dictionary<uint, StatusEffect> statusEffectList = new Dictionary<uint, StatusEffect>(); private Dictionary<uint, StatusEffect> statusEffectList = new Dictionary<uint, StatusEffect>();
@ -120,7 +119,7 @@ namespace Meteor.Map
{ {
Zone zone = new Zone(reader.GetUInt32(0), reader.GetString(1), reader.GetUInt16(2), reader.GetString(3), reader.GetUInt16(4), reader.GetUInt16(5), Zone zone = new Zone(reader.GetUInt32(0), reader.GetString(1), reader.GetUInt16(2), reader.GetString(3), reader.GetUInt16(4), reader.GetUInt16(5),
reader.GetUInt16(6), reader.GetBoolean(7), reader.GetBoolean(8), reader.GetBoolean(9), reader.GetBoolean(10), reader.GetBoolean(11), reader.GetBoolean(12)); reader.GetUInt16(6), reader.GetBoolean(7), reader.GetBoolean(8), reader.GetBoolean(9), reader.GetBoolean(10), reader.GetBoolean(11), reader.GetBoolean(12));
zoneList[zone.actorId] = zone; zoneList[zone.ZoneId] = zone;
count1++; count1++;
} }
} }
@ -141,7 +140,6 @@ namespace Meteor.Map
string query = @" string query = @"
SELECT SELECT
id,
parentZoneId, parentZoneId,
privateAreaName, privateAreaName,
privateAreaType, privateAreaType,
@ -163,7 +161,7 @@ namespace Meteor.Map
if (zoneList.ContainsKey(parentZoneId)) if (zoneList.ContainsKey(parentZoneId))
{ {
Zone parent = zoneList[parentZoneId]; Zone parent = zoneList[parentZoneId];
PrivateArea privArea = new PrivateArea(parent, reader.GetUInt32("id"), reader.GetString("className"), reader.GetString("privateAreaName"), reader.GetUInt32("privateAreaType"), reader.GetUInt16("dayMusic"), reader.GetUInt16("nightMusic"), reader.GetUInt16("battleMusic")); PrivateArea privArea = new PrivateArea(parent, reader.GetString("className"), reader.GetString("privateAreaName"), reader.GetInt32("privateAreaType"), reader.GetUInt16("dayMusic"), reader.GetUInt16("nightMusic"), reader.GetUInt16("battleMusic"));
parent.AddPrivateArea(privArea); parent.AddPrivateArea(privArea);
} }
else else
@ -184,57 +182,6 @@ namespace Meteor.Map
Program.Log.Info(String.Format("Loaded {0} zones and {1} private areas.", count1, count2)); Program.Log.Info(String.Format("Loaded {0} zones and {1} private areas.", count1, count2));
} }
public void LoadZoneEntranceList()
{
zoneEntranceList = new Dictionary<uint, ZoneEntrance>();
int count = 0;
using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD)))
{
try
{
conn.Open();
string query = @"
SELECT
id,
zoneId,
spawnType,
spawnX,
spawnY,
spawnZ,
spawnRotation,
privateAreaName
FROM server_zones_spawnlocations";
MySqlCommand cmd = new MySqlCommand(query, conn);
using (MySqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
uint id = reader.GetUInt32(0);
string privArea = null;
if (!reader.IsDBNull(7))
privArea = reader.GetString(7);
ZoneEntrance entance = new ZoneEntrance(reader.GetUInt32(1), privArea, 1, reader.GetByte(2), reader.GetFloat(3), reader.GetFloat(4), reader.GetFloat(5), reader.GetFloat(6));
zoneEntranceList[id] = entance;
count++;
}
}
}
catch (MySqlException e)
{ Console.WriteLine(e); }
finally
{
conn.Dispose();
}
}
Program.Log.Info(String.Format("Loaded {0} zone spawn locations.", count));
}
public void LoadSeamlessBoundryList() public void LoadSeamlessBoundryList()
{ {
seamlessBoundryList = new Dictionary<uint, List<SeamlessBoundry>>(); seamlessBoundryList = new Dictionary<uint, List<SeamlessBoundry>>();
@ -329,7 +276,7 @@ namespace Meteor.Map
{ {
uint id = reader.GetUInt32("id"); uint id = reader.GetUInt32("id");
string classPath = reader.GetString("classPath"); string classPath = reader.GetString("classPath");
uint nameId = reader.GetUInt32("displayNameId"); int nameId = reader.GetInt32("displayNameId");
string eventConditions = null; string eventConditions = null;
uint propertyFlags = reader.GetUInt32("propertyFlags"); uint propertyFlags = reader.GetUInt32("propertyFlags");
@ -415,7 +362,7 @@ namespace Meteor.Map
customName = reader.GetString("customDisplayName"); customName = reader.GetString("customDisplayName");
string uniqueId = reader.GetString("uniqueId"); string uniqueId = reader.GetString("uniqueId");
string privAreaName = reader.GetString("privateAreaName"); string privAreaName = reader.GetString("privateAreaName");
uint privAreaLevel = reader.GetUInt32("privateAreaLevel"); int privAreaType = reader.GetInt32("privateAreaLevel");
float x = reader.GetFloat("positionX"); float x = reader.GetFloat("positionX");
float y = reader.GetFloat("positionY"); float y = reader.GetFloat("positionY");
float z = reader.GetFloat("positionZ"); float z = reader.GetFloat("positionZ");
@ -423,7 +370,7 @@ namespace Meteor.Map
ushort state = reader.GetUInt16("actorState"); ushort state = reader.GetUInt16("actorState");
uint animId = reader.GetUInt32("animationId"); uint animId = reader.GetUInt32("animationId");
SpawnLocation spawn = new SpawnLocation(classId, uniqueId, zoneId, privAreaName, privAreaLevel, x, y, z, rot, state, animId); SpawnLocation spawn = new SpawnLocation(classId, uniqueId, zoneId, privAreaName, privAreaType, x, y, z, rot, state, animId);
zone.AddSpawnLocation(spawn); zone.AddSpawnLocation(spawn);
@ -599,7 +546,7 @@ namespace Meteor.Map
{ {
while (reader.Read()) while (reader.Read())
{ {
area = area ?? Server.GetWorldManager().GetZone(reader.GetUInt16("zoneId")); area = area ?? Server.GetWorldManager().GetArea(reader.GetUInt16("zoneId"));
int actorId = area.GetActorCount() + 1; int actorId = area.GetActorCount() + 1;
bnpc = area.GetBattleNpcById(id); bnpc = area.GetBattleNpcById(id);
@ -764,14 +711,14 @@ namespace Meteor.Map
{ {
Area oldZone; Area oldZone;
if (player.zone != null) if (player.CurrentArea != null)
{ {
oldZone = player.zone; oldZone = player.CurrentArea;
oldZone.RemoveActorFromZone(player); oldZone.RemoveActorFromZone(player);
} }
//Add player to new zone and update //Add player to new zone and update
Zone newZone = GetZone(destinationZoneId); Area newZone = GetArea(destinationZoneId);
//This server does not contain that zoneId //This server does not contain that zoneId
if (newZone == null) if (newZone == null)
@ -779,11 +726,9 @@ namespace Meteor.Map
newZone.AddActorToZone(player); newZone.AddActorToZone(player);
player.zone = newZone; player.CurrentArea = newZone;
player.zoneId = destinationZoneId;
player.zone2 = null; player.zone2 = null;
player.zoneId2 = 0;
player.SendSeamlessZoneInPackets(); player.SendSeamlessZoneInPackets();
@ -796,7 +741,7 @@ namespace Meteor.Map
public void MergeZones(Player player, uint mergedZoneId) public void MergeZones(Player player, uint mergedZoneId)
{ {
//Add player to new zone and update //Add player to new zone and update
Zone mergedZone = GetZone(mergedZoneId); Area mergedZone = GetArea(mergedZoneId);
//This server does not contain that zoneId //This server does not contain that zoneId
if (mergedZone == null) if (mergedZone == null)
@ -805,7 +750,6 @@ namespace Meteor.Map
mergedZone.AddActorToZone(player); mergedZone.AddActorToZone(player);
player.zone2 = mergedZone; player.zone2 = mergedZone;
player.zoneId2 = mergedZone.actorId;
player.SendMessage(0x20, "", "Merging Zones"); player.SendMessage(0x20, "", "Merging Zones");
@ -826,26 +770,29 @@ namespace Meteor.Map
* ->If merge box, MergeZones * ->If merge box, MergeZones
*/ */
if (player.zone == null) if (player.CurrentArea == null)
return; return;
uint regionId = player.zone.regionId; uint regionId = player.CurrentArea.RegionId;
if (!seamlessBoundryList.ContainsKey(regionId)) if (!seamlessBoundryList.ContainsKey(regionId))
return; return;
foreach (SeamlessBoundry bounds in seamlessBoundryList[regionId]) foreach (SeamlessBoundry bounds in seamlessBoundryList[regionId])
{ {
uint zoneId = player.CurrentArea.ZoneId;
uint zoneId2 = player.zone2.ZoneId;
if (CheckPosInBounds(player.positionX, player.positionZ, bounds.zone1_x1, bounds.zone1_y1, bounds.zone1_x2, bounds.zone1_y2)) if (CheckPosInBounds(player.positionX, player.positionZ, bounds.zone1_x1, bounds.zone1_y1, bounds.zone1_x2, bounds.zone1_y2))
{ {
if (player.zoneId == bounds.zoneId1 && player.zoneId2 == 0) if (zoneId == bounds.zoneId1 && zoneId2 == 0)
return; return;
DoSeamlessZoneChange(player, bounds.zoneId1); DoSeamlessZoneChange(player, bounds.zoneId1);
} }
else if (CheckPosInBounds(player.positionX, player.positionZ, bounds.zone2_x1, bounds.zone2_y1, bounds.zone2_x2, bounds.zone2_y2)) else if (CheckPosInBounds(player.positionX, player.positionZ, bounds.zone2_x1, bounds.zone2_y1, bounds.zone2_x2, bounds.zone2_y2))
{ {
if (player.zoneId == bounds.zoneId2 && player.zoneId2 == 0) if (zoneId == bounds.zoneId2 && zoneId2 == 0)
return; return;
DoSeamlessZoneChange(player, bounds.zoneId2); DoSeamlessZoneChange(player, bounds.zoneId2);
@ -853,13 +800,13 @@ namespace Meteor.Map
else if (CheckPosInBounds(player.positionX, player.positionZ, bounds.merge_x1, bounds.merge_y1, bounds.merge_x2, bounds.merge_y2)) else if (CheckPosInBounds(player.positionX, player.positionZ, bounds.merge_x1, bounds.merge_y1, bounds.merge_x2, bounds.merge_y2))
{ {
uint merged; uint merged;
if (player.zoneId == bounds.zoneId1) if (zoneId == bounds.zoneId1)
merged = bounds.zoneId2; merged = bounds.zoneId2;
else else
merged = bounds.zoneId1; merged = bounds.zoneId1;
//Already merged //Already merged
if (player.zoneId2 == merged) if (zoneId2 == merged)
return; return;
MergeZones(player, merged); MergeZones(player, merged);
@ -881,29 +828,12 @@ namespace Meteor.Map
return xIsGood && yIsGood; return xIsGood && yIsGood;
} }
//Moves actor to new zone, and sends packets to spawn at the given zone entrance
public void DoZoneChange(Player player, uint zoneEntrance)
{
if (!zoneEntranceList.ContainsKey(zoneEntrance))
{
Program.Log.Error("Given zone entrance was not found: " + zoneEntrance);
return;
}
ZoneEntrance ze = zoneEntranceList[zoneEntrance];
DoZoneChange(player, ze.zoneId, ze.privateAreaName, ze.privateAreaType, ze.spawnType, ze.spawnX, ze.spawnY, ze.spawnZ, ze.spawnRotation);
}
//Moves actor to new zone, and sends packets to spawn at the given coords. //Moves actor to new zone, and sends packets to spawn at the given coords.
public void DoZoneChange(Player player, uint destinationZoneId, string destinationPrivateArea, int destinationPrivateAreaType, byte spawnType, float spawnX, float spawnY, float spawnZ, float spawnRotation) public void DoZoneChange(Player player, uint destinationZoneId, string destinationPrivateArea, int destinationPrivateAreaType, byte spawnType, float spawnX, float spawnY, float spawnZ, float spawnRotation)
{ {
//Add player to new zone and update //Add player to new zone and update
Area newArea; //Add check for -1 if it is a instance
Area newArea = GetArea(destinationZoneId, destinationPrivateArea, destinationPrivateAreaType);
if (destinationPrivateArea == null)
newArea = GetZone(destinationZoneId);
else //Add check for -1 if it is a instance
newArea = GetZone(destinationZoneId).GetPrivateArea(destinationPrivateArea, (uint)destinationPrivateAreaType);
//This server does not contain that zoneId //This server does not contain that zoneId
if (newArea == null) if (newArea == null)
@ -915,20 +845,16 @@ namespace Meteor.Map
player.playerSession.LockUpdates(true); player.playerSession.LockUpdates(true);
Area oldZone = player.zone; Area oldArea = player.CurrentArea;
//Remove player from currentZone if transfer else it's login //Remove player from currentZone if transfer else it's login
if (player.zone != null) if (player.CurrentArea != null)
{ {
oldZone.RemoveActorFromZone(player); oldArea.RemoveActorFromZone(player);
} }
newArea.AddActorToZone(player); newArea.AddActorToZone(player);
//Update player actor's properties //Update player actor's properties
player.zoneId = newArea is PrivateArea ? ((PrivateArea)newArea).GetParentZone().actorId : newArea.actorId; player.CurrentArea = newArea;
player.privateArea = newArea is PrivateArea ? ((PrivateArea)newArea).GetPrivateAreaName() : null;
player.privateAreaType = newArea is PrivateArea ? ((PrivateArea)newArea).GetPrivateAreaType() : 0;
player.zone = newArea;
player.positionX = spawnX; player.positionX = spawnX;
player.positionY = spawnY; player.positionY = spawnY;
player.positionZ = spawnZ; player.positionZ = spawnZ;
@ -945,8 +871,8 @@ namespace Meteor.Map
player.currentContentGroup.RemoveMember(player.actorId); player.currentContentGroup.RemoveMember(player.actorId);
player.SetCurrentContentGroup(null); player.SetCurrentContentGroup(null);
if (oldZone is PrivateAreaContent) if (oldArea is PrivateAreaContent)
((PrivateAreaContent)oldZone).CheckDestroy(); ((PrivateAreaContent)oldArea).CheckDestroy();
} }
//Send packets //Send packets
@ -965,32 +891,15 @@ namespace Meteor.Map
LuaEngine.GetInstance().CallLuaFunction(player, newArea, "onZoneIn", true); LuaEngine.GetInstance().CallLuaFunction(player, newArea, "onZoneIn", true);
} }
//Moves actor within zone to spawn position
public void DoPlayerMoveInZone(Player player, uint zoneEntrance)
{
if (!zoneEntranceList.ContainsKey(zoneEntrance))
{
Program.Log.Error("Given zone entrance was not found: " + zoneEntrance);
return;
}
ZoneEntrance ze = zoneEntranceList[zoneEntrance];
if (ze.zoneId != player.zoneId)
return;
DoPlayerMoveInZone(player, ze.spawnX, ze.spawnY, ze.spawnZ, ze.spawnRotation, ze.spawnType);
}
//Moves actor within the zone //Moves actor within the zone
public void DoPlayerMoveInZone(Player player, float spawnX, float spawnY, float spawnZ, float spawnRotation, byte spawnType = 0xF) public void DoPlayerMoveInZone(Player player, float spawnX, float spawnY, float spawnZ, float spawnRotation, byte spawnType = 0xF)
{ {
//Remove player from currentZone if transfer else it's login //Remove player from currentZone if transfer else it's login
if (player.zone != null) if (player.CurrentArea != null)
{ {
player.playerSession.LockUpdates(true); player.playerSession.LockUpdates(true);
player.zone.RemoveActorFromZone(player); player.CurrentArea.RemoveActorFromZone(player);
player.zone.AddActorToZone(player); player.CurrentArea.AddActorToZone(player);
//Update player actor's properties; //Update player actor's properties;
player.positionX = spawnX; player.positionX = spawnX;
@ -1019,21 +928,17 @@ namespace Meteor.Map
player.playerSession.LockUpdates(true); player.playerSession.LockUpdates(true);
Area oldZone = player.zone; Area oldArea = player.CurrentArea;
//Remove player from currentZone if transfer else it's login //Remove player from currentZone if transfer else it's login
if (player.zone != null) if (player.CurrentArea != null)
{ {
oldZone.RemoveActorFromZone(player); oldArea.RemoveActorFromZone(player);
} }
contentArea.AddActorToZone(player); contentArea.AddActorToZone(player);
//Update player actor's properties //Update player actor's properties
player.zoneId = contentArea.GetParentZone().actorId; player.CurrentArea = contentArea;
player.privateArea = contentArea.GetPrivateAreaName();
player.privateAreaType = contentArea.GetPrivateAreaType();
player.zone = contentArea;
player.positionX = spawnX; player.positionX = spawnX;
player.positionY = spawnY; player.positionY = spawnY;
player.positionZ = spawnZ; player.positionZ = spawnZ;
@ -1058,18 +963,14 @@ namespace Meteor.Map
public void DoZoneIn(Player player, bool isLogin, ushort spawnType) public void DoZoneIn(Player player, bool isLogin, ushort spawnType)
{ {
//Add player to new zone and update //Add player to new zone and update
Area playerArea; Area playerArea = player.CurrentArea;
if (player.privateArea != null)
playerArea = GetPrivateArea(player.zoneId, player.privateArea, player.privateAreaType);
else
playerArea = GetZone(player.zoneId);
//This server does not contain that zoneId //This server does not contain that zoneId
if (playerArea == null) if (playerArea == null)
return; return;
//Set the current zone and add player //Set the current zone and add player
player.zone = playerArea; player.CurrentArea = playerArea;
playerArea.AddActorToZone(player); playerArea.AddActorToZone(player);
@ -1319,7 +1220,7 @@ namespace Meteor.Map
return; return;
} }
Player inviter = (Player)invitee.GetZone().FindActorInArea(group.GetHost()); Player inviter = (Player)invitee.CurrentArea.FindActorInArea(group.GetHost());
//DeleteTradeGroup(group.groupIndex); //DeleteTradeGroup(group.groupIndex);
@ -1340,7 +1241,7 @@ namespace Meteor.Map
return; return;
} }
Player invitee = (Player)inviter.GetZone().FindActorInArea(group.GetOther()); Player invitee = (Player)inviter.CurrentArea.FindActorInArea(group.GetOther());
inviter.SendGameMessage(GetActor(), 25042, 0x20); //You cancel the trade. inviter.SendGameMessage(GetActor(), 25042, 0x20); //You cancel the trade.
if (invitee != null) if (invitee != null)
@ -1359,7 +1260,7 @@ namespace Meteor.Map
return; return;
} }
Player invitee = (Player)inviter.GetZone().FindActorInArea(group.GetOther()); Player invitee = (Player)inviter.CurrentArea.FindActorInArea(group.GetOther());
inviter.SendGameMessage(GetActor(), 25041, 0x20); //You cancel the trade. inviter.SendGameMessage(GetActor(), 25041, 0x20); //You cancel the trade.
if (invitee != null) if (invitee != null)
@ -1378,7 +1279,7 @@ namespace Meteor.Map
return; return;
} }
Player inviter = (Player)invitee.GetZone().FindActorInArea(group.GetHost()); Player inviter = (Player)invitee.CurrentArea.FindActorInArea(group.GetHost());
if (inviter != null) if (inviter != null)
inviter.SendGameMessage(GetActor(), 25038, 0x20); //Your trade request fails inviter.SendGameMessage(GetActor(), 25038, 0x20); //Your trade request fails
@ -1891,25 +1792,17 @@ namespace Meteor.Map
return null; return null;
} }
public Zone GetZone(uint zoneId) public Area GetArea(uint zoneId, string privateAreaName = "", int privateAreaType = 0)
{ {
lock (zoneList) lock (zoneList)
{ {
if (!zoneList.ContainsKey(zoneId)) if (!zoneList.ContainsKey(zoneId))
return null; return null;
if (privateAreaName == null || privateAreaName.Equals(""))
return zoneList[zoneId]; return zoneList[zoneId];
} else
} return zoneList[zoneId].GetPrivateArea(privateAreaName, privateAreaType);
public PrivateArea GetPrivateArea(uint zoneId, string privateArea, uint privateAreaType)
{
lock (zoneList)
{
if (!zoneList.ContainsKey(zoneId))
return null;
return zoneList[zoneId].GetPrivateArea(privateArea, privateAreaType);
} }
} }
@ -1947,14 +1840,6 @@ namespace Meteor.Map
} }
} }
public ZoneEntrance GetZoneEntrance(uint entranceId)
{
if (zoneEntranceList.ContainsKey(entranceId))
return zoneEntranceList[entranceId];
else
return null;
}
public ActorClass GetActorClass(uint id) public ActorClass GetActorClass(uint id)
{ {
if (actorClasses.ContainsKey(id)) if (actorClasses.ContainsKey(id))

View file

@ -71,7 +71,6 @@ namespace Meteor.World
mWorldManager = new WorldManager(this); mWorldManager = new WorldManager(this);
mWorldManager.LoadZoneServerList(); mWorldManager.LoadZoneServerList();
mWorldManager.LoadZoneEntranceList();
mWorldManager.ConnectToZoneServers(); mWorldManager.ConnectToZoneServers();
IPEndPoint serverEndPoint = new System.Net.IPEndPoint(IPAddress.Parse(ConfigConstants.OPTIONS_BINDIP), int.Parse(ConfigConstants.OPTIONS_PORT)); IPEndPoint serverEndPoint = new System.Net.IPEndPoint(IPAddress.Parse(ConfigConstants.OPTIONS_BINDIP), int.Parse(ConfigConstants.OPTIONS_PORT));

View file

@ -107,57 +107,6 @@ namespace Meteor.World
} }
public void LoadZoneEntranceList()
{
zoneEntranceList = new Dictionary<uint, ZoneEntrance>();
int count = 0;
using (MySqlConnection conn = new MySqlConnection(String.Format("Server={0}; Port={1}; Database={2}; UID={3}; Password={4}", ConfigConstants.DATABASE_HOST, ConfigConstants.DATABASE_PORT, ConfigConstants.DATABASE_NAME, ConfigConstants.DATABASE_USERNAME, ConfigConstants.DATABASE_PASSWORD)))
{
try
{
conn.Open();
string query = @"
SELECT
id,
zoneId,
spawnType,
spawnX,
spawnY,
spawnZ,
spawnRotation,
privateAreaName
FROM server_zones_spawnlocations";
MySqlCommand cmd = new MySqlCommand(query, conn);
using (MySqlDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
uint id = reader.GetUInt32(0);
string privArea = null;
if (!reader.IsDBNull(7))
privArea = reader.GetString(7);
ZoneEntrance entance = new ZoneEntrance(reader.GetUInt32(1), privArea, reader.GetByte(2), reader.GetFloat(3), reader.GetFloat(4), reader.GetFloat(5), reader.GetFloat(6));
zoneEntranceList[id] = entance;
count++;
}
}
}
catch (MySqlException e)
{ Console.WriteLine(e); }
finally
{
conn.Dispose();
}
}
Program.Log.Info(String.Format("Loaded {0} zone spawn locations.", count));
}
public void ConnectToZoneServers() public void ConnectToZoneServers()
{ {
Program.Log.Info("--------------------------"); Program.Log.Info("--------------------------");