eluna-scripts-ornfelt/lua/WowEmulationScriptPack/Lua/WIP/PropertiesServer.lua

791 lines
41 KiB
Lua
Raw Permalink Normal View History

2023-08-16 00:50:59 +02:00
local AIO = AIO or require("AIO")
local PropertyHandlers = AIO.AddHandlers("Properties", {})
-- Property NPC
PROPERTY_NPC = 1000204
-- level admin to set up these npcs
ADMIN_LEVEL = 3
-- list of property types
local property_types = {
"inn",
"farm",
"mine",
}
local property_types_keyed = {
["inn"] = "inn",
["farm"] = "farm",
["mine"] = "mine",
}
-- object ids to register events for
local property_types_objects = {
1000011,
1000012,
1000013,
1000014,
1000015,
1000016,
1000017,
1000018,
1000005,
1000019,
1000020,
}
-- what object linked to what type of property
local property_types_objects_keyed = {
["inn"] = {1000005},
}
-- what object casts what spell
local property_types_objects_spells = {
[1000005] = 2000042,
[1000016] = 2000044,
[1000017] = 2000046,
[1000018] = 2000049,
[1000019] = 2000045,
[1000020] = 2000048,
[1000011] = 2000051,
[1000012] = 2000053,
[1000013] = 2000055,
[1000014] = 2000057,
[1000015] = 2000059,
}
-- spellid, reagent1, reagent2, reagent3, reagent4, reagentcount1, reagentcount2, reagentcount3, reagentcount4
local crafting_materials = {
[2000046] = {1999960, 0, 0, 0, 1, 0, 0, 0},
[2000048] = {1999958, 0, 0, 0, 1, 0, 0, 0},
[2000049] = {1999957, 0, 0, 0, 5, 0, 0, 0},
[2000051] = {1999965, 0, 0, 0, 5, 0, 0, 0},
[2000053] = {1999964, 0, 0, 0, 5, 0, 0, 0},
[2000055] = {1999963, 0, 0, 0, 5, 0, 0, 0},
[2000057] = {1999962, 0, 0, 0, 5, 0, 0, 0},
[2000059] = {1999961, 0, 0, 0, 5, 0, 0, 0},
}
--[[
local function Static_Property_Hello(event, player, creature)
local setup = false
local creature_guid = creature:GetDBTableGUIDLow()
local Static_Property_Query1 = WorldDBQuery("SELECT `property_name`, `property_lease`, `property_type`, `confirmed`, `property_fee` FROM `eluna_property_static` WHERE `creature_guid` = " ..creature_guid.. ";")
if Static_Property_Query1 == nil then
WorldDBExecute("INSERT INTO `elunaworld`.`eluna_property_static` (`creature_guid`, `property_name`, `property_lease`, `property_fee`, `property_type`, `confirmed`) VALUES ('" ..creature_guid.. "','Empty', '0', '10', 'empty', '0');")
player:SendBroadcastMessage("[Property System]: Performing first time setup. Please talk to the NPC again.")
player:GossipClearMenu()
player:GossipComplete()
return false
elseif Static_Property_Query1 ~= nil and Static_Property_Query1:GetInt32(3) == 0 then
setup = true
end
-- setup stuff
if (player:GetGMRank() < ADMIN_LEVEL) and setup == true then
player:SendBroadcastMessage("[Property System]: This property is not setup yet.")
player:GossipClearMenu()
player:GossipComplete()
return false
elseif (player:GetGMRank() >= ADMIN_LEVEL) and setup == true then
player:SendBroadcastMessage("[Property System]: This property is not set up. The options presented to you will disappear after clicking confirm.")
player:GossipMenuAddItem(0, "Set Name of Property", 65027, 10, true, "Set the name. The current name is: " ..Static_Property_Query1:GetString(0).. ".")
player:GossipMenuAddItem(0, "Set Property Lease", 65027, 11, true, "Set the price to buy the property. The current price is: " ..Static_Property_Query1:GetInt32(1).. ".")
player:GossipMenuAddItem(0, "Set Property Type", 65027, 12, true, "Set the type. The current type is: " ..Static_Property_Query1:GetString(2).. ".")
player:GossipMenuAddItem(0, "Set Service Fee", 65027, 13, true, "Set the service fee for using objects linked to this property. The current fee is: " ..Static_Property_Query1:GetInt32(4).. ".")
player:GossipMenuAddItem(0, "Get Objects", 65027, 14)
player:GossipMenuAddItem(0, "Confirm", 65027, 19, false, "This will confirm the options for this property. You cannot go back.")
player:GossipMenuAddItem(0, "Nevermind", 65027, 0)
player:GossipSendMenu(65027, creature, MenuId)
return
end
-- what shows when setup is finished
-- if player:GetGMRank() >= ADMIN_LEVEL then
-- player:GossipMenuAddItem(0, "Un-Confirm", 65027, 19, false, "This will un-confirm the options for this property, sending it back for editing. You cannot go back.")
-- end
local Static_Property_Query2 = WorldDBQuery("SELECT `character`, `property_lease`, `character_guid`, `property_fee` FROM `eluna_property_owner` WHERE `creature_guid` = " ..creature_guid.. " AND `owner_current` = 1;")
lease_amount = 0
char_guid = 0
service_fee = 0
if Static_Property_Query2 ~= nil then
char_guid = Static_Property_Query2:GetInt32(2)
lease_amount = Static_Property_Query2:GetInt32(1)
service_fee = Static_Property_Query2:GetInt32(3)
end
if lease_amount == 0 then
lease_amount = Static_Property_Query1:GetInt32(1)
service_fee = Static_Property_Query1:GetInt32(4)
end
lease_amount_raw = lease_amount
lease_amount = math.floor(lease_amount * 1.25)
if char_guid == 0 or char_guid ~= player:GetGUIDLow() then
-- not owner
player:GossipMenuAddItem(0, "View Property Information", 65027, 1)
player:GossipMenuAddItem(0, "View Service Fee", 65027, 4)
player:GossipMenuAddItem(0, "Purchase Property", 65027, 2, false, "Do you wish to purchase this property for " ..lease_amount.. "?")
player:GossipMenuAddItem(0, "Purchase Inventory", 65027, 3) -- shows list of items in property inventory, clicking on them shows popup of quantity at cost per. editbox buys X.
player:GossipMenuAddItem(0, "Nevermind", 65027, 0)
player:GossipSendMenu(65027, creature, MenuId)
return
else
player:GossipMenuAddItem(0, "Change Name", 65027, 21, true, "Do you wish to change the property name? It is currently " ..Static_Property_Query1:GetString(0).. ".")
player:GossipMenuAddItem(0, "Increase Lease", 65027, 22, true, "Do you wish to increase the lease amount? The base amount is currently " ..lease_amount_raw.. ".")
player:GossipMenuAddItem(0, "Set Service Fee", 65027, 23, true, "The service fee is how much you charge individuals for using your property. The current fee is " ..service_fee.. ". Do you wish to change it?")
player:GossipMenuAddItem(0, "Withdraw Treasury", 65027, 24, true, "Do you wish to withdraw from your treasury? It currently contains STUFF.")
player:GossipMenuAddItem(0, "Withdraw Inventory", 65027, 25, true, "Do you wish to withdraw ITEM from your property? There is currently AMOUNT.") -- lists items, clicking on them shows quantity amount popup and editbox to withdraw x amount.
player:GossipMenuAddItem(0, "Sell Inventory", 65027, 26, true, "The service charge is how much you charge individuals for using your property. The current service charge is SERVICE CHARGE. Do you wish to change it?") -- lists items, shows price popup and editbox to withdraw x amount.
player:GossipMenuAddItem(0, "Nevermind", 65027, 0)
player:GossipSendMenu(65027, creature, MenuId)
return
end
end
]]
--[[
local function Static_Property_Select(event, player, creature, sender, intid, code)
player:GossipClearMenu()
player:GossipComplete()
local creature_guid = creature:GetDBTableGUIDLow()
local Static_Property_Query1 = WorldDBQuery("SELECT `property_name`, `property_lease`, `property_type`, `confirmed`, `property_fee` FROM `eluna_property_static` WHERE `creature_guid` = " ..creature_guid.. ";")
if (Static_Property_Query1 == nil) then
player:SendBroadcastMessage("[Property System]: Something went horribly wrong.")
return false
end
-- setup intids
if (intid >= 10) and (intid < 20) then
if (intid == 10) then
code = sterilize.generic(code)
WorldDBExecute("UPDATE `eluna_property_static` SET `property_name` = '" ..code.. "' WHERE `creature_guid` = " ..creature_guid.. ";")
player:SendBroadcastMessage("[Property System]: The property linked to creature GUID " ..creature_guid.. " has been renamed to " ..code.. ".")
return false
elseif (intid == 11) then
if tonumber(code) == nil then
player:SendBroadcastMessage("[Property System]: You must input a valid number.")
return false
else
WorldDBExecute("UPDATE `eluna_property_static` SET `property_lease` = '" ..code.. "' WHERE `creature_guid` = " ..creature_guid.. ";")
player:SendBroadcastMessage("[Property System]: The property linked to creature GUID " ..creature_guid.. " has been priced to " ..code.. ".")
return false
end
elseif (intid == 12) then
code = sterilize.generic(code)
if property_types_keyed[code] == nil then
player:SendBroadcastMessage("[Property System]: You must input a valid property type. Below are valid property types.")
for x=1,#property_types,1 do
player:SendBroadcastMessage(property_types[x])
end
return false
else
WorldDBExecute("UPDATE `eluna_property_static` SET `property_type` = '" ..code.. "' WHERE `creature_guid` = " ..creature_guid.. ";")
player:SendBroadcastMessage("[Property System]: The property linked to creature GUID " ..creature_guid.. " has been typed to " ..code.. ".")
return false
end
elseif (intid == 13) then
if tonumber(code) == nil then
player:SendBroadcastMessage("[Property System]: You must input a valid number.")
return false
else
WorldDBExecute("UPDATE `eluna_property_static` SET `property_fee` = '" ..code.. "' WHERE `creature_guid` = " ..creature_guid.. ";")
player:SendBroadcastMessage("[Property System]: The property service fee to creature GUID " ..creature_guid.. " has been priced to " ..code.. ".")
return false
end
elseif (intid == 14) then
if Static_Property_Query1:GetString(2) == "empty" then
player:SendBroadcastMessage("[Property System]: Error. Cannot grab objects because property type is not yet specified.")
return false
end
for x=1,#property_types_objects_keyed[Static_Property_Query1:GetString(2)],1 do
local gameobjects_table = creature:GetGameObjectsInRange( 300, property_types_objects_keyed[Static_Property_Query1:GetString(2)][x] )
if #gameobjects_table == 0 then
player:SendBroadcastMessage("[Property System]: No valid gameobjects found for gameobject entry " ..property_types_objects_keyed[Static_Property_Query1:GetString(2)][x].. ".")
return false
end
z = 0
for m=1,#gameobjects_table,1 do
object_guid = gameobjects_table[m]:GetDBTableGUIDLow()
local Static_Property_Query6 = WorldDBQuery("SELECT `guid`, `creature_guid` FROM `eluna_property_gameobjects` WHERE `guid` = " ..object_guid.. ";")
if Static_Property_Query6 ~= nil then
if Static_Property_Query6:GetInt32(1) ~= creature:GetDBTableGUIDLow() then
player:SendBroadcastMessage("[Property System]: The gameobject with GUID " ..object_guid.. " is being used by another property with creature GUID " ..Static_Property_Query6:GetInt32(1).. ". Please contact a developer to fix this.")
else
player:SendBroadcastMessage("[Property System]: The gameobject with GUID " ..object_guid.. " is being used by your property.")
end
else
WorldDBExecute("INSERT INTO `elunaworld`.`eluna_property_gameobjects` (`guid`, `entry`, `creature_guid`) VALUES ('" ..object_guid.. "', '" ..gameobjects_table[m]:GetEntry().. "', '" ..creature:GetDBTableGUIDLow().. "');")
player:SendBroadcastMessage("[Property System]: Acquired gameobject with GUID " ..object_guid.. ".")
z = z + 1
end
end
end
player:SendBroadcastMessage("[Property System]: " ..z.. " objects linked to creature GUID " ..creature:GetDBTableGUIDLow().. ".")
elseif (intid == 19) then
WorldDBExecute("UPDATE `eluna_property_static` SET `confirmed` = 1 WHERE `creature_guid` = " ..creature_guid.. ";")
WorldDBExecute("INSERT INTO `elunaworld`.`eluna_property_owner` (`creature_guid`, `owner_current`, `account`, `character`, `character_guid`, `property_lease`, `property_fee`) VALUES ('" ..creature_guid.. "', '1', '" ..player:GetAccountName().. "', 'none', '0', '0', '" ..Static_Property_Query1:GetInt32(4).. "');")
player:SendBroadcastMessage("[Property System]: The property linked to creature GUID " ..creature_guid.. " has been confirmed and ready for players.")
return false
end
end
-- viewer, but not owner intids
if (intid >= 1) and (intid < 10) then
local Static_Property_Query3 = WorldDBQuery("SELECT `character`, `property_lease`, `property_fee` FROM `eluna_property_owner` WHERE `creature_guid` = " ..creature_guid.. " AND `owner_current` = 1;")
property_name = Static_Property_Query1:GetString(0)
owner_name = Static_Property_Query3:GetString(0)
if (intid == 1) then
player:SendBroadcastMessage("[Property System]: This " ..Static_Property_Query1:GetString(2).. ", named " ..property_name.. " is owned by " ..owner_name.. ".")
return false
elseif (intid == 2) then
lease_amount = Static_Property_Query3:GetInt32(1)
if lease_amount == 0 then
lease_amount = Static_Property_Query1:GetInt32(1)
end
lease_amount = math.floor(lease_amount * 1.25)
if GetCurrency(player) < lease_amount then
player:SendBroadcastMessage("[Property System]: You do not have enough to purchase this property.")
return false
end
ChangeCurrency(player, -1 * lease_amount)
WorldDBExecute("UPDATE `eluna_property_owner` SET `owner_current` = 0 WHERE `creature_guid` = " ..creature_guid.. " AND `owner_current` = 1;")
local Static_Property_Query4 = WorldDBQuery("SELECT `character` FROM `eluna_property_owner` WHERE `character_guid` = " ..player:GetGUIDLow().. " AND `creature_guid` = " ..creature_guid.. ";")
if Static_Property_Query4 == nil then
WorldDBExecute("INSERT INTO `elunaworld`.`eluna_property_owner` (`creature_guid`, `owner_current`, `account`, `character`, `character_guid`, `property_lease`) VALUES ('" ..creature_guid.. "', '1', '" ..player:GetAccountName().. "', '" ..player:GetName().. "', '" ..player:GetGUIDLow().. "', '" ..lease_amount.. "');")
else
WorldDBExecute("UPDATE `eluna_property_owner` SET `owner_current` = 1 WHERE `creature_guid` = " ..creature_guid.. " AND `character_guid` = " ..player:GetGUIDLow().. ";")
end
player:SendBroadcastMessage("[Property System]: You bought " ..property_name.. " from " ..owner_name.. " for " ..lease_amount.. ".")
return false
elseif (intid == 4) then
service_fee = Static_Property_Query3:GetInt32(2)
auto_string, gold, silver, copper = TranslateCurrency(service_fee)
-- player:SendBroadcastMessage("[Property System]: The fee to operate on this property is " ..gold.. " Gold " ..silver.. " Silver " ..copper.. " Copper.")
player:SendBroadcastMessage("[Property System]: The fee to operate on this property is " ..auto_string.. ".")
return false
end
end
-- owner intids
if (intid >= 20) and (intid < 30) then
local Static_Property_Query3 = WorldDBQuery("SELECT `character`, `property_lease` FROM `eluna_property_owner` WHERE `creature_guid` = " ..creature_guid.. " AND `owner_current` = 1;")
if (intid == 21) then
code = sterilize.generic(code)
WorldDBExecute("UPDATE `eluna_property_static` SET `property_name` = '" ..code.. "' WHERE `creature_guid` = " ..creature_guid.. ";")
player:SendBroadcastMessage("[Property System]: The property linked to creature GUID " ..creature_guid.. " has been renamed to " ..code.. ".")
return false
elseif (intid == 22) then
lease_amount_raw = Static_Property_Query3:GetInt32(1)
if tonumber(code) == nil then
player:SendBroadcastMessage("[Property System]: You must input a valid number.")
return false
elseif GetCurrency(player) < (code + lease_amount_raw) then
player:SendBroadcastMessage("[Property System]: You do not have enough currency.")
return false
else
ChangeCurrency(player, -1 * (code + lease_amount_raw))
WorldDBExecute("UPDATE `eluna_property_owner` SET `property_lease` = '" ..(code + lease_amount_raw).. "' WHERE `creature_guid` = " ..creature_guid.. " AND `owner_current` = 1;")
player:SendBroadcastMessage("[Property System]: The property linked to creature GUID " ..creature_guid.. " has been priced to " ..(code + lease_amount_raw).. ".")
return false
end
elseif (intid == 23) then
if tonumber(code) == nil then
player:SendBroadcastMessage("[Property System]: You must input a valid number.")
return false
else
WorldDBExecute("UPDATE `eluna_property_owner` SET `property_fee` = '" ..code.. "' WHERE `creature_guid` = " ..creature_guid.. " AND `owner_current` = 1;")
player:SendBroadcastMessage("[Property System]: The property service fee to creature GUID " ..creature_guid.. " has been priced to " ..code.. ".")
return false
end
end
end
end
]]
-- temp solution for owners to get property items while an inventory UI is made
function PropertyHandlers.Temp_Get_Items(player)
local target = player:GetSelection()
if target == nil then
player:SendBroadcastMessage("???")
return false
end
print("SELECT item_entry, item_quantity FROM eluna_property_inventory WHERE creature_guid = " ..target:GetDBTableGUIDLow().. " AND char_guid = " ..player:GetGUIDLow().. ";")
local Property_Query8 = WorldDBQuery("SELECT item_entry, item_quantity FROM eluna_property_inventory WHERE creature_guid = " ..target:GetDBTableGUIDLow().. " AND char_guid = " ..player:GetGUIDLow().. ";")
if Property_Query8 == nil then
player:SendBroadcastMessage("no inventory detected.")
return false
end
for x=1,Property_Query8:GetRowCount(),1 do
item_entry = Property_Query8:GetInt32(0)
item_quantity = Property_Query8:GetInt32(1)
player:AddItem(item_entry, item_quantity)
-- PrintInfo("[Property]: Player " ..player:GetGUIDLow().. " " ..player:GetName().. " has withdrawn " ..item_entry.. " " ..item_quantity.. ".")
Property_Query8:NextRow()
end
player:SendBroadcastMessage("[Property System]: You have successfully withdrawn all items.")
WorldDBExecute("UPDATE eluna_property_inventory SET item_quantity = 0 WHERE creature_guid = " ..target:GetDBTableGUIDLow().. " AND char_guid = " ..player:GetGUIDLow().. ";")
PrintInfo("[Property]: Player " ..player:GetGUIDLow().. " " ..player:GetName().. " has withdrawn their inventory.")
end
-- here we make clicking an object cost money $$$
-- SERVICE FEE START
function PropertyHandlers.Service_Confirm(player, object_guid, object_entry)
local Static_Property_Query7 = WorldDBQuery("SELECT eluna_property_owner.creature_guid,eluna_property_gameobjects.guid,eluna_property_owner.property_fee,eluna_property_owner.character_guid FROM eluna_property_gameobjects INNER JOIN eluna_property_owner ON eluna_property_owner.creature_guid WHERE eluna_property_owner.owner_current = 1 AND eluna_property_owner.creature_guid = eluna_property_gameobjects.creature_guid AND eluna_property_gameobjects.guid = " ..object_guid.. ";")
if Static_Property_Query7 == nil then
player:SendBroadcastMessage("HOW DID YOU GET THIS?")
return false
end
local spell_to_cast = property_types_objects_spells[object_entry]
if crafting_materials[spell_to_cast] ~= nil then
for m=1,4,1 do
if crafting_materials[spell_to_cast][m] == 0 then
break
elseif player:GetItemCount(crafting_materials[spell_to_cast][m]) < crafting_materials[spell_to_cast][(m + 4)] then
player:SendBroadcastMessage("[Property System]: You do not have enough materials to craft this. Missing: " ..crafting_materials[spell_to_cast][(m + 4)].. "x " ..GetItemLink(crafting_materials[spell_to_cast][m]).. ".")
return false
end
end
end
service_fee = Static_Property_Query7:GetInt32(2)
creature_guid = Static_Property_Query7:GetInt32(0)
owner_guid = Static_Property_Query7:GetInt32(3)
if GetCurrency(player) < service_fee then
player:SendBroadcastMessage("[Property System]: You do not have enough money to perform this action.")
return false
elseif GetCurrency(player) >= service_fee then
ChangeCurrency(player, -1 * service_fee)
-- add currency to owners
_, gold_count, silver_count, copper_count = TranslateCurrency(service_fee)
print("UPDATE eluna_property_inventory SET item_quantity = item_quantity + " ..gold_count.. " WHERE item_entry = 1999998 AND creature_guid = " ..creature_guid.. " AND char_guid = " ..owner_guid.. ";")
WorldDBExecute("UPDATE eluna_property_inventory SET item_quantity = item_quantity + " ..gold_count.. " WHERE item_entry = 1999998 AND creature_guid = " ..creature_guid.. " AND char_guid = " ..owner_guid.. ";")
WorldDBExecute("UPDATE eluna_property_inventory SET item_quantity = item_quantity + " ..copper_count.. " WHERE item_entry = 1999997 AND creature_guid = " ..creature_guid.. " AND char_guid = " ..owner_guid.. ";")
WorldDBExecute("UPDATE eluna_property_inventory SET item_quantity = item_quantity + " ..silver_count.. " WHERE item_entry = 1999999 AND creature_guid = " ..creature_guid.. " AND char_guid = " ..owner_guid.. ";")
end
local gameobjects_table = player:GetGameObjectsInRange( 25, object_entry )
if #gameobjects_table == nil then
player:SendBroadcastMessage("WHAT?")
return false
end
for x=1,#gameobjects_table,1 do
if gameobjects_table[x]:GetDBTableGUIDLow() == object_guid then
player:CastSpell( player, spell_to_cast, false)
end
end
end
local function Static_Property_OnUse(event, go, player)
spell = property_types_objects_spells[go:GetEntry()]
local Static_Property_Query7 = WorldDBQuery("SELECT eluna_property_owner.creature_guid,eluna_property_gameobjects.guid,eluna_property_owner.property_fee,eluna_property_gameobjects.entry FROM eluna_property_gameobjects INNER JOIN eluna_property_owner ON eluna_property_owner.creature_guid WHERE eluna_property_owner.owner_current = 1 AND eluna_property_owner.creature_guid = eluna_property_gameobjects.creature_guid AND eluna_property_gameobjects.guid = " ..go:GetDBTableGUIDLow().. ";")
if Static_Property_Query7 == nil then
player:SendBroadcastMessage("[Property System]: The object you just tried to use is not yet synced to an existing property.")
return false
else
object_guid = go:GetDBTableGUIDLow()
service_fee = TranslateCurrency(Static_Property_Query7:GetInt32(2))
object_entry = Static_Property_Query7:GetInt32(3)
AIO.Handle(player, "Properties", "POPUP_SERVICE", service_fee, object_guid, object_entry, spell)
end
end
local function Static_Property_RegisterEvents()
m = 0
for x=1,#property_types_objects,1 do
m = m + 1
RegisterGameObjectEvent( property_types_objects[x], 14, Static_Property_OnUse)
end
print("[Property System]: " ..m.. " Object IDs registered for properties.")
end
Static_Property_RegisterEvents()
-- SERVICE FEE STOP
-- experimental stuff start
local function Property_Hello(event, player, creature)
local creature_guid = creature:GetDBTableGUIDLow()
local Property_Query1 = WorldDBQuery("SELECT creature_guid, property_name, property_lease, property_fee, confirmed, property_type FROM eluna_property_static WHERE creature_guid = " ..creature_guid.. ";")
if Property_Query1 == nil then
player:SendBroadcastMessage("[Property System]: Performing first time setup. Please talk to the NPC again.")
WorldDBExecute("INSERT INTO `elunaworld`.`eluna_property_static` (`creature_guid`, `property_name`, `property_lease`, `property_fee`, `property_type`, `confirmed`) VALUES ('" ..creature_guid.. "', 'None', '54321', '12345', 'None', '0');")
player:GossipClearMenu()
player:GossipComplete()
return false
end
is_confirmed = Property_Query1:GetInt32(4)
property_name = Property_Query1:GetString(1)
property_lease = Property_Query1:GetInt32(2)
property_fee = Property_Query1:GetInt32(3)
property_type = Property_Query1:GetString(5)
is_owner = false
race = 0
gender = 0
character = "None"
local Property_Query3 = WorldDBQuery("SELECT `owner_current`,`character`,`property_lease`,`property_fee`,`gender`,`race`,`character_guid` FROM `eluna_property_owner` WHERE `creature_guid` = " ..creature_guid.. " AND `owner_current` = 1;")
if Property_Query3 ~= nil then
property_lease = Property_Query3:GetInt32(2)
property_fee = Property_Query3:GetInt32(3)
race = Property_Query3:GetInt32(5)
gender = Property_Query3:GetInt32(4)
character = Property_Query3:GetString(1)
if Property_Query3:GetInt32(6) == player:GetGUIDLow() then
is_owner = true
end
end
is_gm = false
_, gold_count_lease, silver_count_lease, copper_count_lease = TranslateCurrency(property_lease)
_, gold_count_fee, silver_count_fee, copper_count_fee = TranslateCurrency(property_fee)
if player:GetGMRank() >= ADMIN_LEVEL then
is_gm = true
end
AIO.Handle(player, "Properties", "Show_Frame_Properties", is_gm, is_confirmed, property_name, gold_count_fee, silver_count_fee, copper_count_fee, gold_count_lease, silver_count_lease, copper_count_lease, property_type, gender, race, is_owner, character)
end
function PropertyHandlers.GM_Confirm(player, property_name, lease_gold, lease_silver, lease_copper, fee_gold, fee_silver, fee_copper, property_type, item_entries, item_quantities, property_type)
if player:GetGMRank() < ADMIN_LEVEL then
player:SendBroadcastMessage("How did you get this? Hax.")
return false
elseif (tonumber(lease_gold) == nil) or (tonumber(lease_silver) == nil) or (tonumber(lease_copper) == nil) or (tonumber(fee_gold) == nil) or (tonumber(fee_silver) == nil) or (tonumber(fee_copper) == nil) then
player:SendBroadcastMessage("How did you get this? !!!")
return false
end
item_entries_list = {}
item_entries_list = getCommandParameters(item_entries)
for x=1,#item_entries_list,1 do
if tonumber(item_entries_list[x]) == nil then
player:SendBroadcastMessage("[Property System]: You did not input a correct number for entry.")
return false
end
end
item_quantities_list = {}
item_quantities_list = getCommandParameters(item_quantities)
for x=1,#item_quantities_list,1 do
if tonumber(item_quantities_list[x]) == nil then
player:SendBroadcastMessage("[Property System]: You did not input a correct number for quantity.")
return false
end
end
if #item_quantities_list ~= #item_entries_list then
player:SendBroadcastMessage("[Property System]: The entries and quantities provided do not align. Do you have an item quantity for every item entry?")
return false
end
target = player:GetSelection()
if target == nil then
player:SendBroadcastMessage("How did you get this? :O")
return false
end
creature_guid = target:GetDBTableGUIDLow()
property_name = sterilize.generic(property_name)
_, property_lease = TranslateCurrency(nil, lease_gold, lease_silver, lease_copper)
_, property_fee = TranslateCurrency(nil, fee_gold, fee_silver, fee_copper)
property_type = property_type
WorldDBExecute("UPDATE `eluna_property_static` SET `property_name` = '" ..property_name.. "',`property_lease` = " ..property_lease.. ",`property_fee` = " ..property_fee.. ",`property_type` = '" ..property_type.. "',`item_entries` = '" ..item_entries.. "',`item_quantities` = '" ..item_quantities.. "',`confirmed` = 1 WHERE `creature_guid` = " ..creature_guid.. ";")
WorldDBExecute("INSERT INTO `elunaworld`.`eluna_property_owner` (`creature_guid`, `owner_current`, `account`, `character`, `character_guid`, `property_lease`, `property_fee`, `gender`, `race`, `for_sale`) VALUES ('" ..creature_guid.. "', '1', '" ..player:GetAccountName().. "', 'None', '0', '" ..property_lease.. "', '" ..property_fee.. "', '0', '0', '0');")
for m=1,#item_entries_list,1 do
WorldDBExecute("INSERT INTO `elunaworld`.`eluna_property_inventory` (`creature_guid`, `char_guid`, `item_entry`, `item_quantity`, `sell_price`, `sell_active`) VALUES ('" ..creature_guid.. "', '0', '" ..item_entries_list[m].. "', '0', '0', '0');")
end
-- WorldDBExecute("INSERT INTO `elunaworld`.`eluna_property_inventory` (`creature_guid`, `char_guid`, `item_entry`, `item_quantity`, `sell_price`, `sell_active`) VALUES ('" ..creature_guid.. "', '" ..player:GetGUIDLow().. "', '" .. "', '123', '0', '0');")
CloseNearbyMenus(player)
end
function PropertyHandlers.GM_Link(player, object_entry)
if player:GetGMRank() < ADMIN_LEVEL then
player:SendBroadcastMessage("oi this is for admins only m8")
return false
end
local target = player:GetSelection()
if target == nil then
player:SendBroadcastMessage("howd you get this?")
return false
end
local creature_guid = target:GetDBTableGUIDLow()
local objects_in_range = player:GetGameObjectsInRange( 300, object_entry )
local b = 0
for m=1,#objects_in_range,1 do
local object_guid = objects_in_range[m]:GetDBTableGUIDLow()
local Property_Query6 = WorldDBQuery("SELECT `guid`,`creature_guid` FROM `eluna_property_gameobjects` WHERE `guid` = " ..object_guid.. ";")
if Property_Query6 ~= nil then
if Property_Query6:GetInt32(1) == creature_guid then
player:SendBroadcastMessage("[Property System]: Gameobject with GUID " ..object_guid.. " is already linked to this property.")
else
player:SendBroadcastMessage("[Property System]: Gameobject with GUID " ..object_guid.. " is already linked to Property NPC " ..Property_Query6:GetInt32(1).. ".")
end
else
WorldDBExecute("INSERT INTO `elunaworld`.`eluna_property_gameobjects` (`guid`, `entry`, `creature_guid`) VALUES ('" ..object_guid.. "', '" ..object_entry.. "', '" ..creature_guid.. "');")
player:SendBroadcastMessage("[Property System]: Gameobject with GUID "..object_guid.. " has been successfully linked.")
b = b + 1
end
end
player:SendBroadcastMessage("[Property System]: " ..b.. " objects with entry " ..object_entry.. " have been linked to this property.")
return false
end
function PropertyHandlers.Purchase_Property_Confirm(player)
local target = player:GetSelection()
if target == nil then
player:SendBroadcastMessage("How did you get this message? :((")
return false
end
local creature_guid = target:GetDBTableGUIDLow()
local Property_Query3 = WorldDBQuery("SELECT `owner_current`,`character`,`property_lease`,`property_fee`,`gender`,`race`,`character_guid`,`for_sale`,`account` FROM `eluna_property_owner` WHERE `creature_guid` = " ..creature_guid.. " AND `owner_current` = 1;")
if Property_Query3 == nil then
player:SendBroadcastMessage("Uh oh you came across a boo boo. A fucky wucky.")
return false
end
property_lease = Property_Query3:GetInt32(2)
property_fee = Property_Query3:GetInt32(3)
player_currency = GetCurrency(player)
for_sale = Property_Query3:GetInt32(7)
if player_currency < property_lease then
player:SendBroadcastMessage("[Property System]: You do not have enough money to purchase this property.")
return false
elseif for_sale == 1 then
player:SendBroadcastMessage("[Property System]: This property is not currently for sale.")
return false
end
ChangeCurrency(player, -1 * property_lease)
-- has the player ever been an owner?
local player_guid = player:GetGUIDLow()
local Property_Query4 = WorldDBQuery("SELECT `character_guid` FROM `eluna_property_owner` WHERE `creature_guid` = " ..creature_guid.." AND `character_guid` = " ..player_guid.. ";")
WorldDBExecute("UPDATE `eluna_property_owner` SET `owner_current` = 0 WHERE `owner_current` = 1 AND `creature_guid` = " ..creature_guid.. ";")
if Property_Query4 == nil then
WorldDBExecute("INSERT INTO `elunaworld`.`eluna_property_owner` (`creature_guid`, `owner_current`, `account`, `character`, `character_guid`, `property_lease`, `property_fee`, `gender`, `race`, `for_sale`) VALUES ('" ..creature_guid.. "', '1', '" ..player:GetAccountName().. "', '" ..player:GetName().. "', '" ..player_guid.. "', '" ..property_lease.. "', '" ..property_fee.. "', '" ..player:GetGender().. "', '" ..player:GetRace().. "', '1');")
local Property_Query7 = WorldDBQuery("SELECT item_entries FROM `eluna_property_static` WHERE `creature_guid` = " ..creature_guid.. ";")
item_entries = {}
item_entries = getCommandParameters(Property_Query7:GetString(0))
for m=1,#item_entries,1 do
WorldDBExecute("INSERT INTO `elunaworld`.`eluna_property_inventory` (`creature_guid`, `char_guid`, `item_entry`, `item_quantity`, `sell_price`, `sell_active`) VALUES ('" ..creature_guid.. "', '" ..player_guid.. "', '" ..item_entries[m].. "', '0', '0', '0');")
end
else
WorldDBExecute("UPDATE `eluna_property_owner` SET `owner_current` = 1, `for_sale` = 1 WHERE `creature_guid` = " ..creature_guid.. " AND `character_guid` = " ..player_guid.. ";")
end
-- dump inventory and property $$$ in new mail for previous owner
local previous_owner_name = Property_Query3:GetString(1)
local previous_owner_guid = Property_Query3:GetInt32(6)
local previous_owner_account = Property_Query3:GetString(8)
local Mail_Query3 = WorldDBQuery("SELECT `item_entry`,`item_quantity` FROM `eluna_property_inventory` WHERE `char_guid` = '" ..previous_owner_guid.. "' AND `creature_guid` = '" ..creature_guid.. "';") -- query for rest of inventory
local auto_string, gold_count, silver_count, copper_count = TranslateCurrency(property_lease)
local mail_text = "Congratulations! Your property has been bought for " ..gold_count.. " Gold " ..silver_count.. " Silver " ..copper_count.. " Copper."
SendMail( "Property Purchased", mail_text, previous_owner_guid, player_guid, 61, 0, 0, 0, GOLD_COIN, gold_count )
SendMail( "Property Purchased", mail_text, previous_owner_guid, player_guid, 61, 0, 0, 0, SILVER_COIN, silver_count )
SendMail( "Property Purchased", mail_text, previous_owner_guid, player_guid, 61, 0, 0, 0, COPPER_COIN, copper_count )
local mail_text = "Here is your inventory from your purchased property"
if Mail_Query3 ~= nil then -- if inventory exists, do thing
for m=1,Mail_Query3:GetRowCount(),1 do
local mail_item_entry = Mail_Query3:GetInt32(0)
local mail_item_quantity = Mail_Query3:GetInt32(1)
--print(mail_item_entry, mail_item_quantity) -- debug statement
if mail_item_quantity > 0 then
SendMail( "Property Purchased", mail_text, previous_owner_guid, player_guid, 61, 0, 0, 0, mail_item_entry, mail_item_quantity )
end
Mail_Query3:NextRow()
end
WorldDBExecute("UPDATE `eluna_property_inventory` SET `item_quantity` = 0 WHERE `char_guid` = '" ..previous_owner_guid.. "' AND `creature_guid` = '" ..creature_guid.. "';")
end
player:SendBroadcastMessage("[Property System]: You have purchased this property from " ..previous_owner_name.. " for " ..auto_string.. ".")
print("[Property System]: " ..player:GetName().. " : " ..player:GetAccountName().. " has purchased property from " ..previous_owner_name.. " : " ..previous_owner_account.. " with creature GUID: " ..creature_guid.. " for " ..property_lease.. ".")
CloseNearbyMenus(player, target)
end
function PropertyHandlers.Property_Name_Confirm(player, property_name)
local target = player:GetSelection()
if target == nil then
player:SendBroadcastMessage("huh?")
return false
end
creature_guid = target:GetDBTableGUIDLow()
property_name = sterilize.generic(property_name)
local Property_Query5 = WorldDBQuery("SELECT `character_guid` FROM `eluna_property_owner` WHERE `owner_current` = 1 AND `character_guid` = " ..player:GetGUIDLow().. " AND `creature_guid` = '" ..creature_guid.. "';")
if Property_Query5 == nil then
player:SendBroadcastMessage("[Property System]: You are not the owner of this property.")
return false
else
WorldDBExecute("UPDATE `eluna_property_static` SET `property_name` = '" ..property_name.. "' WHERE `creature_guid` = '" ..creature_guid.. "';")
player:SendBroadcastMessage("[Property System]: You have updated your property name to " ..property_name.. ".")
return false
end
end
function PropertyHandlers.Property_Lease_Confirm(player, lease_gold, lease_silver, lease_copper)
local target = player:GetSelection()
if target == nil then
player:SendBroadcastMessage("huh?")
return false
end
creature_guid = target:GetDBTableGUIDLow()
if tonumber(lease_gold) == nil or tonumber(lease_silver) == nil or tonumber(lease_copper) == nil then
player:SendBroadcastMessage("your lease amounts are nil.")
return false
end
local Property_Query5 = WorldDBQuery("SELECT `character_guid`,`property_lease`,`for_sale` FROM `eluna_property_owner` WHERE `owner_current` = 1 AND `character_guid` = " ..player:GetGUIDLow().. " AND `creature_guid` = '" ..creature_guid.. "';")
if Property_Query5 == nil then
player:SendBroadcastMessage("[Property System]: You are not the owner of this property.")
return false
end
local auto_string, money = TranslateCurrency(nil, lease_gold, lease_silver, lease_copper)
property_lease = Property_Query5:GetInt32(1)
-- if money < property_lease then
-- player:SendBroadcastMessage("[Property System]: You cannot make the lease lower.")
-- return false
-- end
local player_currency = GetCurrency(player)
-- local difference = money - property_lease
-- if player_currency < (difference) then
-- player:SendBroadcastMessage("[Property System]: You do not have enough to deposit into the lease.")
-- return false
-- end
if Property_Query5:GetInt32(2) == 1 then
WorldDBExecute("UPDATE eluna_property_owner SET `for_sale` = 0 WHERE `creature_guid` = '" ..creature_guid.. "' AND `character_guid` = '" ..player:GetGUIDLow().. "';")
state = "FOR SALE"
else
WorldDBExecute("UPDATE eluna_property_owner SET `for_sale` = 1 WHERE `creature_guid` = '" ..creature_guid.. "' AND `character_guid` = '" ..player:GetGUIDLow().. "';")
state = "NOT FOR SALE"
end
-- ChangeCurrency(player, -1 * difference)
local auto_string2 = TranslateCurrency(difference)
WorldDBExecute("UPDATE `eluna_property_owner` SET `property_lease` = '" ..money.. "' WHERE `creature_guid` = '" ..creature_guid.. "' AND `character_guid` = '" ..player:GetGUIDLow().. "';")
-- player:SendBroadcastMessage("[Property System]: You have deposited " ..auto_string2.. " into the lease on your property, making the total lease " ..auto_string.. ".")
player:SendBroadcastMessage("[Property System]: You have set your property price to " ..auto_string.. " and the property is now " ..state.. ".")
return false
end
function PropertyHandlers.Property_Service_Confirm(player, fee_gold, fee_silver, fee_copper)
local target = player:GetSelection()
if target == nil then
player:SendBroadcastMessage("huh?")
return false
end
creature_guid = target:GetDBTableGUIDLow()
if tonumber(fee_gold) == nil or tonumber(fee_silver) == nil or tonumber(fee_copper) == nil then
player:SendBroadcastMessage("your lease amounts are nil.")
return false
end
local Property_Query5 = WorldDBQuery("SELECT `character_guid`,`property_lease` FROM `eluna_property_owner` WHERE `owner_current` = 1 AND `character_guid` = " ..player:GetGUIDLow().. " AND `creature_guid` = '" ..creature_guid.. "';")
if Property_Query5 == nil then
player:SendBroadcastMessage("[Property System]: You are not the owner of this property.")
return false
else
local auto_string, money = TranslateCurrency(nil, fee_gold, fee_silver, fee_copper)
WorldDBExecute("UPDATE `eluna_property_owner` SET `property_fee` = '" ..money.. "' WHERE `creature_guid` = '" ..creature_guid.. "' AND `character_guid` = '" ..player:GetGUIDLow().. "';")
player:SendBroadcastMessage("[Property System]: You have updated the service charge on your property to " ..auto_string.. ".")
return false
end
end
-- called to close nearby menus on confirm purchase etc
function CloseNearbyMenus(player, target)
local player_list = player:GetPlayersInRange(25)
for x=1,#player_list,1 do
if player_list[x]:GetSelection() == target then
AIO.Handle(player_list[x], "Properties", "Close_Menus")
end
end
end
-- apply 2 stacks of training buff
TRAINING_DUMMY_BUFF = 2000043
local function TrainingBuff(event, player, spell, skipCheck)
if spell:GetEntry() ~= TRAINING_DUMMY_BUFF then
return false
else
player:AddAura(TRAINING_DUMMY_BUFF, player)
return false
end
end
EXPERIMENT_NPC = 1000205
RegisterCreatureGossipEvent(EXPERIMENT_NPC, 1, Property_Hello)
RegisterPlayerEvent(5, TrainingBuff)
-- experimental stuff done
-- how often do you want to flush properties and give them items?
-- TIME_TO_FLUSH = 86400
TIME_TO_FLUSH = 86400
-- every 15mins this function is ran. it gets the gametime and puts it in a table if it doesnt exist. if it does, and its compared to an old timestamp, and that timestamp is 24+ hours old, do stuff.
local function Static_Property_Flush(eventId, delay, repeats)
local Played_Query3 = WorldDBQuery("SELECT `time` FROM timestamps WHERE `type` = 3;") -- type 3 = server gametime, saved every "CreateLuaEvent". we use this instead of type 2 because type2 is exclusive to wagecuck system.
if (Played_Query3 == nil) then
WorldDBExecute("INSERT INTO `elunaworld`.`timestamps` (`type`, `time`) VALUES ('3', '" ..tostring(GetGameTime()).. "');") -- type 2 = server gametime, saved every "CreateLuaEvent".
elseif ((GetGameTime() - Played_Query3:GetInt32(0)) >= TIME_TO_FLUSH) then -- if (Current servertime - saved servertime) is more than 7 days (604800 seconds)
local Static_Property_Query5 = WorldDBQuery("SELECT eluna_property_owner.creature_guid,eluna_property_owner.character_guid,eluna_property_static.item_entries,eluna_property_static.item_quantities FROM eluna_property_static INNER JOIN eluna_property_owner ON eluna_property_owner.creature_guid WHERE eluna_property_owner.owner_current = 1 AND eluna_property_owner.creature_guid = eluna_property_static.creature_guid;")
if Static_Property_Query5 == nil then
PrintInfo("[Property System]: No active properties detected.")
return
end
PrintInfo("[Property System]: Flushing properties...")
for x=1,Static_Property_Query5:GetRowCount(),1 do
item_entries = {}
item_entries = getCommandParameters(Static_Property_Query5:GetString(2))
item_quantities = {}
item_quantities = getCommandParameters(Static_Property_Query5:GetString(3))
char_guid_flush = Static_Property_Query5:GetInt32(1)
for m=1,#item_entries,1 do
WorldDBExecute("UPDATE `eluna_property_inventory` SET item_quantity = item_quantity + " ..item_quantities[m].. " WHERE item_entry = " ..item_entries[m].. " AND `char_guid` = " ..char_guid_flush.. ";")
end
Static_Property_Query5:NextRow()
end
WorldDBExecute("UPDATE timestamps SET `time` = " ..tostring(GetGameTime()).. " WHERE `type` = 3;")
PrintInfo("[Property System]: Flushing properties done.")
SendWorldMessage("[Property System]: Flushing properties...")
end
end
-- CreateLuaEvent(Static_Property_Flush, 900000, 0) -- 900,000 milliseconds is 15 minutes. That's the save interval in worldserver config.
CreateLuaEvent(Static_Property_Flush, 15000, 0)
-- RegisterCreatureGossipEvent(PROPERTY_NPC, 1, Static_Property_Hello)
-- RegisterCreatureGossipEvent(PROPERTY_NPC, 2, Static_Property_Select)