diff --git a/FFXIVClassic Map Server/Database.cs b/FFXIVClassic Map Server/Database.cs
index f8ef5398..cf60cfe8 100644
--- a/FFXIVClassic Map Server/Database.cs
+++ b/FFXIVClassic Map Server/Database.cs
@@ -1624,9 +1624,9 @@ namespace FFXIVClassic_Map_Server
string query = @"
INSERT INTO server_items
- (itemId, quality)
+ (itemId, quantity, quality)
VALUES
- (@itemId, @quality);
+ (@itemId, @quantity, @quality);
";
string query2 = @"
@@ -1638,6 +1638,7 @@ namespace FFXIVClassic_Map_Server
MySqlCommand cmd = new MySqlCommand(query, conn);
cmd.Parameters.AddWithValue("@itemId", itemId);
+ cmd.Parameters.AddWithValue("@quantity", quantity);
cmd.Parameters.AddWithValue("@quality", quality);
cmd.ExecuteNonQuery();
diff --git a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj
index 99ceaa98..08a41bec 100644
--- a/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj
+++ b/FFXIVClassic Map Server/FFXIVClassic Map Server.csproj
@@ -110,6 +110,7 @@
+
diff --git a/FFXIVClassic Map Server/PacketProcessor.cs b/FFXIVClassic Map Server/PacketProcessor.cs
index 829c1b0d..af97b1f0 100644
--- a/FFXIVClassic Map Server/PacketProcessor.cs
+++ b/FFXIVClassic Map Server/PacketProcessor.cs
@@ -175,11 +175,6 @@ namespace FFXIVClassic_Map_Server
Actor ownerActor = Server.GetStaticActors(eventStart.scriptOwnerActorID);
-
- session.GetActor().currentEventOwner = eventStart.scriptOwnerActorID;
- session.GetActor().currentEventName = eventStart.triggerName;
-
-
if (ownerActor == null)
{
//Is it your retainer?
@@ -187,7 +182,7 @@ namespace FFXIVClassic_Map_Server
ownerActor = session.GetActor().currentSpawnedRetainer;
//Is it a instance actor?
if (ownerActor == null)
- ownerActor = session.GetActor().zone.FindActorInArea(session.GetActor().currentEventOwner);
+ ownerActor = session.GetActor().zone.FindActorInArea(eventStart.scriptOwnerActorID);
if (ownerActor == null)
{
//Is it a Director?
diff --git a/FFXIVClassic Map Server/WorldManager.cs b/FFXIVClassic Map Server/WorldManager.cs
index db1eacfc..1a322dfd 100644
--- a/FFXIVClassic Map Server/WorldManager.cs
+++ b/FFXIVClassic Map Server/WorldManager.cs
@@ -1060,18 +1060,15 @@ namespace FFXIVClassic_Map_Server
if (cost < 0)
return false;
- if (itemToBuy.GetBazaarMode() == InventoryItem.TYPE_STACK)
- {
- itemToBuy.ChangeQuantity(-quantity);
- buyer.AddItemStack(itemToBuy.itemId, quantity, itemToBuy.quality);
- buyer.GetItemPackage(Inventory.CURRENCY_CRYSTALS).RemoveItem(1000001, cost);
- }
- else
+ if (itemToBuy.GetBazaarMode() == InventoryItem.TYPE_SINGLE || itemToBuy.GetBazaarMode() == InventoryItem.TYPE_MULTI || itemToBuy.GetBazaarMode() == InventoryItem.TYPE_STACK)
{
itemToBuy.ChangeQuantity(-quantity);
buyer.AddItem(itemToBuy.itemId, quantity, itemToBuy.quality);
buyer.GetItemPackage(Inventory.CURRENCY_CRYSTALS).RemoveItem(1000001, cost);
}
+
+ if (itemToBuy.quantity == 0)
+ Database.ClearBazaarEntry(bazaar, itemToBuy);
bazaar.CheckBazaarFlags();
diff --git a/FFXIVClassic Map Server/actors/chara/Character.cs b/FFXIVClassic Map Server/actors/chara/Character.cs
index e89cd8b6..dad48311 100644
--- a/FFXIVClassic Map Server/actors/chara/Character.cs
+++ b/FFXIVClassic Map Server/actors/chara/Character.cs
@@ -151,18 +151,7 @@ namespace FFXIVClassic_Map_Server.Actors
ushort itemPackage = GetPackageForItem(catalogID);
if (itemPackages.ContainsKey(itemPackage))
{
- InventoryItem item = Server.GetWorldManager().CreateItem(catalogID, quantity, quality);
- itemPackages[itemPackage].AddItem(item);
- }
- }
-
- public void AddItemStack(uint catalogID, int quantity, byte quality)
- {
- ItemData itemData = Server.GetItemGamedata(catalogID);
- if (itemData != null)
- {
- int totalQuantity = itemData.maxStack * quantity;
- AddItem(catalogID, totalQuantity, quality);
+ itemPackages[itemPackage].AddItem(catalogID, quantity, quality);
}
}
diff --git a/FFXIVClassic Map Server/actors/chara/player/Player.cs b/FFXIVClassic Map Server/actors/chara/player/Player.cs
index 08fc70d2..193d4f6d 100644
--- a/FFXIVClassic Map Server/actors/chara/player/Player.cs
+++ b/FFXIVClassic Map Server/actors/chara/player/Player.cs
@@ -88,10 +88,7 @@ namespace FFXIVClassic_Map_Server.Actors
74000, 78000, 81000, 85000, 89000, 92000, 96000, 100000, 100000, 110000}; //Level <= 50
//Event Related
- public uint currentEventOwner = 0;
- public string currentEventName = "";
-
- public Coroutine currentEventRunning;
+ private Stack runningEvents = new Stack();
//Player Info
public uint destinationZone;
@@ -1645,12 +1642,15 @@ namespace FFXIVClassic_Map_Server.Actors
public void StartEvent(Actor owner, EventStartPacket start)
{
- LuaEngine.GetInstance().EventStarted(this, owner, start);
+ GameEvent startedEvent = new GameEvent(start.triggerName, this, owner);
+ runningEvents.Push(startedEvent);
+ LuaEngine.GetInstance().EventStarted(startedEvent, start);
}
public void UpdateEvent(EventUpdatePacket update)
{
- LuaEngine.GetInstance().OnEventUpdate(this, update.luaParams);
+ GameEvent updateEvent = runningEvents.Peek();
+ LuaEngine.GetInstance().OnEventUpdate(updateEvent, update.luaParams);
}
public void KickEvent(Actor actor, string conditionName, params object[] parameters)
@@ -1683,20 +1683,17 @@ namespace FFXIVClassic_Map_Server.Actors
public void RunEventFunction(string functionName, params object[] parameters)
{
List lParams = LuaUtils.CreateLuaParamList(parameters);
- SubPacket spacket = RunEventFunctionPacket.BuildPacket(actorId, currentEventOwner, currentEventName, functionName, lParams);
+ SubPacket spacket = RunEventFunctionPacket.BuildPacket(actorId, runningEvents.Peek().GetOwnerActorId(), runningEvents.Peek().GetEventName(), functionName, lParams);
spacket.DebugPrintSubPacket();
QueuePacket(spacket);
}
public void EndEvent()
{
- SubPacket p = EndEventPacket.BuildPacket(actorId, currentEventOwner, currentEventName);
+ GameEvent endingEvent = runningEvents.Pop();
+ SubPacket p = EndEventPacket.BuildPacket(actorId, endingEvent.GetOwnerActorId(), endingEvent.GetEventName());
p.DebugPrintSubPacket();
QueuePacket(p);
-
- currentEventOwner = 0;
- currentEventName = "";
- currentEventRunning = null;
}
public void SendInstanceUpdate()
diff --git a/FFXIVClassic Map Server/lua/LuaEngine.cs b/FFXIVClassic Map Server/lua/LuaEngine.cs
index 6108d7e8..bdf3b515 100644
--- a/FFXIVClassic Map Server/lua/LuaEngine.cs
+++ b/FFXIVClassic Map Server/lua/LuaEngine.cs
@@ -36,7 +36,6 @@ namespace FFXIVClassic_Map_Server.lua
private Timer luaTimer;
-
private LuaEngine()
{
UserData.RegistrationPolicy = InteropRegistrationPolicy.Automatic;
@@ -108,25 +107,25 @@ namespace FFXIVClassic_Map_Server.lua
}
}
- public void OnEventUpdate(Player player, List args)
+ public void OnEventUpdate(GameEvent gEvent, List args)
{
- if (mSleepingOnPlayerEvent.ContainsKey(player.actorId))
+ if (mSleepingOnPlayerEvent.ContainsKey(gEvent.GetUniqueEventId()))
{
try
{
- Coroutine coroutine = mSleepingOnPlayerEvent[player.actorId];
- mSleepingOnPlayerEvent.Remove(player.actorId);
+ Coroutine coroutine = mSleepingOnPlayerEvent[gEvent.GetUniqueEventId()];
+ mSleepingOnPlayerEvent.Remove(gEvent.GetUniqueEventId());
DynValue value = coroutine.Resume(LuaUtils.CreateLuaParamObjectList(args));
- ResolveResume(player, coroutine, value);
+ ResolveResume(gEvent.GetPlayerActor(), coroutine, value);
}
catch (ScriptRuntimeException e)
{
- LuaEngine.SendError(player, String.Format("OnEventUpdated: {0}", e.DecoratedMessage));
- player.EndEvent();
+ LuaEngine.SendError(gEvent.GetPlayerActor(), String.Format("OnEventUpdated: {0}", e.DecoratedMessage));
+ gEvent.GetPlayerActor().EndEvent();
}
}
else
- player.EndEvent();
+ gEvent.GetPlayerActor().EndEvent();
}
private static string GetScriptPath(Actor target)
@@ -365,14 +364,15 @@ namespace FFXIVClassic_Map_Server.lua
}
}
- public void EventStarted(Player player, Actor target, EventStartPacket eventStart)
+ public void EventStarted(GameEvent gEvent, EventStartPacket eventStart)
{
List lparams = eventStart.luaParams;
lparams.Insert(0, new LuaParam(2, eventStart.triggerName));
- if (mSleepingOnPlayerEvent.ContainsKey(player.actorId))
+
+ if (mSleepingOnPlayerEvent.ContainsKey(gEvent.GetUniqueEventId()))
{
- Coroutine coroutine = mSleepingOnPlayerEvent[player.actorId];
- mSleepingOnPlayerEvent.Remove(player.actorId);
+ Coroutine coroutine = mSleepingOnPlayerEvent[gEvent.GetUniqueEventId()];
+ mSleepingOnPlayerEvent.Remove(gEvent.GetUniqueEventId());
try{
DynValue value = coroutine.Resume();
@@ -380,16 +380,16 @@ namespace FFXIVClassic_Map_Server.lua
}
catch (ScriptRuntimeException e)
{
- LuaEngine.SendError(player, String.Format("OnEventStarted: {0}", e.DecoratedMessage));
- player.EndEvent();
+ LuaEngine.SendError(gEvent.GetPlayerActor(), String.Format("OnEventStarted: {0}", e.DecoratedMessage));
+ gEvent.GetPlayerActor().EndEvent();
}
}
else
{
- if (target is Director)
- ((Director)target).OnEventStart(player, LuaUtils.CreateLuaParamObjectList(lparams));
+ if (gEvent.GetOwnerActor() is Director)
+ ((Director)gEvent.GetOwnerActor()).OnEventStart(gEvent.GetPlayerActor(), LuaUtils.CreateLuaParamObjectList(lparams));
else
- CallLuaFunction(player, target, "onEventStarted", false, LuaUtils.CreateLuaParamObjectList(lparams));
+ CallLuaFunction(gEvent.GetPlayerActor(), gEvent.GetOwnerActor(), "onEventStarted", false, LuaUtils.CreateLuaParamObjectList(lparams));
}
}
@@ -611,7 +611,7 @@ namespace FFXIVClassic_Map_Server.lua
return;
List SendError = new List();
player.SendMessage(SendMessagePacket.MESSAGE_TYPE_SYSTEM_ERROR, "", message);
- player.QueuePacket(EndEventPacket.BuildPacket(player.actorId, player.currentEventOwner, player.currentEventName));
+ player.EndEvent();
}
}