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(); } }