• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

NPC Marriage system 8.6+ [Fixed]

Critico

Sexy
Joined
Mar 25, 2010
Messages
370
Reaction score
176
Explanation: Is the marriage system known but has been reformulated to work in newer versions.

Description: The system features:

Item: Players who get married receive a Wedding ring with your names and wedding date.
6lh9f.png

Outfit: players who marry receive outfit, if you divorce, you lose the outfits.
Outfit_Wedding_Male.gif
Outfit_Wedding_Female.gif

Look: the look shows who is married
w9R0p.png

Combat: The player can not attack your patner
commands:
/marriage info - shows a window in the price of marriage/divorce and the minimum level to get married.
/marriage status - shows who is married and the wedding date


Another most important thing is that both players DO NOT need to be online to divorce, for example:

JOHN married to MARIA, JOHN goes to the NPC and pays a price for a divorce, only those seeking a divorce who pays the fee, MARY then not need pay anything, because Ex-Patner JOHN already paid, What she needs to do is "subscribe" to the npc your divorce too.

How to Marry?

Player1:
A5TAH.png


Player2:
6xsGo.png





In your db execute:

Code:
CREATE TABLE marriage_system (
                        id                                        INTEGER NOT NULL,
                        player_id   INTEGER NOT NULL,
                        partner   VARCHAR( 255 )  NOT NULL,
                        marriage_date INTEGER NOT NULL,
                        PRIMARY KEY ( id )
);


Data > Xml > outfits.xml e add in outfit husband e wife:

Code:
quest="150420"

thereby:

Code:
<outfit id="23" quest="150420">
<list gender="0" lookType="329" name="Wife"/>
<list gender="1" lookType="328" name="Husband"/>
</outfit>

Mods:


MarriageSystem.xml
Code:
<?xml version="1.0" encoding="UTF-8"?> 
<mod name="MarriageSystem" version="1.0" author="Vodkart" contact="xtibia.com" enabled="yes"> 
<config name="marry_func"><![CDATA[

marry_config = {
OnlyDifferentSex = false,
Marry_Price = 300000,
Divorce_Price = 100000,
Level = 50,
MaxSqm = 7, -- to marry
Text = {'I love you!','My love!','Baby dear!'},
RingID = 10502,
TimeAccept = 60,
storage1 = 300235,
storage2 = 300236,
storage3 = 300237
}

function isMarried(cid)
local m = db.getResult("SELECT `player_id` FROM `marriage_system` WHERE `player_id` = '"..getPlayerGUID(cid).."';")
if(m:getID() == -1) then
local e = db.getResult("SELECT `partner` FROM `marriage_system` WHERE `partner` = '"..getPlayerGUID(cid).."';")
if(e:getID() == -1) then
return false
end
end
return true
end
function isPatner(cid)
local p = db.getResult("SELECT `partner` FROM `marriage_system` WHERE `player_id` = '"..getPlayerGUID(cid).."';")
if(p:getID() == -1) then
return true
end
return false
end
function Ponline(player)
local rows = db.getResult("SELECT `online` FROM `players` WHERE `id` = " .. player .. ";")
local on = rows:getDataInt("online")
if on ~= 0 then
return TRUE
else
return FALSE
end
end
function getPartner(cid)
if isPatner(cid) then
a = db.getResult("SELECT `player_id` FROM `marriage_system` WHERE `partner` = '"..getPlayerGUID(cid).."';")
b = "player_id"
else
a = db.getResult("SELECT `partner` FROM `marriage_system` WHERE `player_id` = '"..getPlayerGUID(cid).."';")
b = "partner"
end
local query = a
return getPlayerNameByGUID(query:getDataString(b))
end
function doMarry(cid, patner)
return db.executeQuery("INSERT INTO `marriage_system` (`player_id`, `partner`, `marriage_date`) VALUES ('".. getPlayerGUID(cid) .."', '"..patner.."', '".. os.time() .."');")
end
function doDivorcePlayer(cid)
if isPatner(cid) then
pid,player = getPlayerGUIDByName(getPartner(cid)),getPlayerByNameWildcard(getPartner(cid))
else
pid,player = getPlayerGUID(cid),cid
end
return db.executeQuery("DELETE FROM `marriage_system` WHERE `player_id` = '" .. pid .. "';")
end
function getMarryDate(cid)
local player = isPatner(cid) and getPlayerGUIDByName(getPartner(cid)) or getPlayerGUID(cid)
local date = db.getResult("SELECT `marriage_date` FROM `marriage_system` WHERE `player_id` = '"..player.."';")
return os.date("%d %B %Y %X ", date:getDataInt("marriage_date"))
end
]]></config>
<talkaction words="/marriage;!marriage" event="buffer"><![CDATA[
domodlib('marry_func')
param = string.lower(param)
if (param == "") then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE,"invalid command, for more information enter !marriage info")
elseif(param == "info") then
doShowTextDialog(cid,2160,"Marriage Info:\n\nLevel Minimum: "..marry_config.Level.."\nMarriage Cost: "..marry_config.Marry_Price.."\nDivorce Cost: "..marry_config.Divorce_Price.."\n\nMarried Players have a special buffs as a wedding gift given by the union\n\nThis bonus is only given if the married players are nearby.")
elseif(param == "status") then
doPlayerPopupFYI(cid,""..(isMarried(cid) and "Marriage Status".."\n\nMarried with: ["..getPartner(cid).."]\n\nThe date of his marriage was: "..getMarryDate(cid).."" or "you are not married").."")
end
return true
]]></talkaction>
<event type="login" name="MarryRegister" event="script"><![CDATA[
function onLogin(cid)
registerCreatureEvent(cid, "MarryLook")
registerCreatureEvent(cid, "MarryNoAttack")
        return true
        end]]></event>   
<event type="look" name="MarryLook" event="script"><![CDATA[
domodlib('marry_func')
function onLook(cid, thing, position, lookDistance)
if isPlayer(thing.uid) and isMarried(thing.uid) then
doPlayerSetSpecialDescription(thing.uid,'.\n'..(getPlayerSex(thing.uid) == 0 and 'She' or 'He')..' is married to '..getPartner(thing.uid))
end                    
return true
end]]></event>
<event type="combat" name="MarryNoAttack" event="script"><![CDATA[
domodlib('marry_func')
if isPlayer(cid) and isPlayer(target) and isMarried(cid) and isMarried(target) then
if (getCreatureName(target) ==  getPartner(cid))then
doPlayerSendCancel(cid, "You may not attack this player.")
return false
end
end
return true
]]></event>
</mod>

NPC

In Npc/Data

Celest.xml
Code:
<?xml version="1.0"?>
<npc name="Celest" script="data/npc/scripts/marriagesystem.lua" walkinterval="50000" floorchange="0">
<health now="1000" max="1000"/>
<look type="130" head="0" body="114" legs="114" feet="0" addons="0"/>
<parameters>
<parameter key="message_greet" value="Hello |PLAYERNAME|. You can {marriage} or may {divorce}."/>
</parameters>
</npc>

Npc/Data/Script

marriagesystem.lua
Code:
domodlib('marry_func')
local keywordHandler = KeywordHandler:new()
local npcHandler = NpcHandler:new(keywordHandler)
NpcSystem.parseParameters(npcHandler)
local talkState = {}
function onCreatureAppear(cid) npcHandler:eek:nCreatureAppear(cid) end
function onCreatureDisappear(cid) npcHandler:eek:nCreatureDisappear(cid) end
function onCreatureSay(cid, type, msg) npcHandler:eek:nCreatureSay(cid, type, msg) end
function onThink() npcHandler:eek:nThink() end
function creatureSayCallback(cid, type, msg)
if(not npcHandler:isFocused(cid)) then
return false
end
local talkUser = NPCHANDLER_CONVbehavior == CONVERSATION_DEFAULT and 0 or cid
msg,players = string.lower(msg), {getPlayerGUID(cid)}
if msgcontains(msg, 'marry') or msgcontains(msg, 'marriage') then
if isMarried(cid) then
npcHandler:say("Sorry, You already is wedded.", cid)
elseif getPlayerStorageValue(cid, marry_config.storage3) >= 1 then
npcHandler:say("you must sign the {divorce}.", cid)
elseif getPlayerStorageValue(cid, marry_config.storage1) >= os.time() then
local pid = getPlayerStorageValue(cid, marry_config.storage2)
npcHandler:say(getPlayerNameByGUID(pid).." has set a wedding date with you. Do you want to {proceed} or {cancel} the wedding?", cid)
talkState[talkUser] = 2
else
npcHandler:say("Would you like to get married?", cid)
talkState[talkUser] = 1
end
elseif msgcontains(msg, "yes") and talkState[talkUser] == 1 then
npcHandler:say("And what\'s the name of your future partner?", cid)
talkState[talkUser] = 3
elseif talkState[talkUser] == 3 then
local player = getPlayerByNameWildcard(msg)
if(not player)then
npcHandler:say(msg.." is offline or does not exist.", cid) return true
elseif isMarried(player) then
npcHandler:say("He already is wedded.", cid) return true
elseif getPlayerStorageValue(cid, marry_config.storage3) >= 1 or getPlayerStorageValue(player, marry_config.storage3) >= 1 then
npcHandler:say((getPlayerStorageValue(cid, marry_config.storage1) >= 1 and "You" or "He").." must sign the divorce.", cid) return true
elseif getPlayerLevel(cid) < marry_config.Level or getPlayerLevel(player) < marry_config.Level then
npcHandler:say("players must to be level "..marry_config.Level, cid) return true
elseif getPlayerStorageValue(player, marry_config.storage1) >= os.time() then
npcHandler:say(msg.." already have a wedding invitation, wait.", cid) return true
elseif getDistanceBetween(getCreaturePosition(cid), getCreaturePosition(player)) > marry_config.MaxSqm then
npcHandler:say("you are far away from each other to get married.", cid) return true
elseif marry_config.OnlyDifferentSex and getPlayerSex(cid) == getPlayerSex(player) then
npcHandler:say("you can only marry the opposite sex", cid) return true
elseif not doPlayerRemoveMoney(cid, marry_config.Marry_Price) then
npcHandler:say("Sorry, but you do not have "..marry_config.Marry_Price.." gp(s) to ask "..msg.." in marriage.", cid) return true
end
setPlayerStorageValue(player, marry_config.storage1,os.time()+marry_config.TimeAccept)
setPlayerStorageValue(player, marry_config.storage2, getPlayerGUID(cid))
npcHandler:say("you asked "..msg.." in marriage, wait a answer!", cid)
doPlayerSendTextMessage(player, MESSAGE_STATUS_CONSOLE_ORANGE,getCreatureName(cid).." asked you in marriage.")
talkState[talkUser] = 0
elseif msgcontains(msg, "proceed") and talkState[talkUser] == 2 then
player = getPlayerStorageValue(cid, marry_config.storage2)
if getPlayerStorageValue(cid, marry_config.storage1) >= os.time() then
if not isMarried(cid) then
if Ponline(player) then
x = getPlayerByNameWildcard(getPlayerNameByGUID(player))
if getDistanceBetween(getCreaturePosition(cid), getCreaturePosition(x)) <= marry_config.MaxSqm then
table.insert(players, player)
doMarry(cid, player)
for i = 1, #players do
local ring = doPlayerAddItem(getPlayerByNameWildcard(getPlayerNameByGUID(players[I])), marry_config.RingID, 1)
doItemSetAttribute(ring, "description", getCreatureName(cid) .. " & " .. getPartner(cid) .. " forever - married on " ..getMarryDate(cid).. ".")
doCreatureSay(getPlayerByNameWildcard(getPlayerNameByGUID(players[I])), marry_config.Text[math.random(1,#marry_config.Text)], TALKTYPE_ORANGE_1)
doSendMagicEffect(getCreaturePosition(getPlayerByNameWildcard(getPlayerNameByGUID(players[I]))), 35)
setPlayerStorageValue(getPlayerByNameWildcard(getPlayerNameByGUID(players[I])), marry_config.storage3, 1)
setPlayerStorageValue(getPlayerByNameWildcard(getPlayerNameByGUID(players[I])), 150420, 1)
end
npcHandler:say("Congratulations! Now you may kiss your partner! to see the status of marriage enter !marriage status", cid)
talkState[talkUser] = 0
else
npcHandler:say("you're far away from her suitor.", cid)
end
else
npcHandler:say("suitor offline.", cid)
end
else
npcHandler:say("you are not married.", cid)
talkState[talkUser] = 0
end
else
npcHandler:say("you do not received none wedding invitation.", cid)
talkState[talkUser] = 0
end
elseif msgcontains(msg, "cancel") and talkState[talkUser] == 2 then
player = getPlayerStorageValue(cid, marry_config.storage2)
if getPlayerStorageValue(cid, marry_config.storage1) >= os.time() then
if not isMarried(cid) then
setPlayerStorageValue(cid, marry_config.storage1, -1)
npcHandler:say("You just refuse the wedding invitation from player "..getPlayerNameByGUID(player), cid)
if Ponline(player) then
doPlayerSendTextMessage(getPlayerByNameWildcard(getPlayerNameByGUID(player)), MESSAGE_STATUS_CONSOLE_ORANGE,getCreatureName(cid).." rejected his marriage proposal.")
end
else
npcHandler:say("you are already married.", cid)
talkState[talkUser] = 0
end
else
npcHandler:say("you do not received none wedding invitation.", cid)
talkState[talkUser] = 0
end
elseif msgcontains(msg, "divorce") then
if isMarried(cid) then
npcHandler:say("Would you like to divorce of your partner for "..marry_config.Divorce_Price.." gp(s) ? {yes}", cid)
talkState[talkUser] = 6
elseif getPlayerStorageValue(cid, marry_config.storage3) >= 1 then
npcHandler:say("you must sign here to end your marriage, ok? {yes}", cid)
talkState[talkUser] = 7
else
npcHandler:say("you are not married", cid)
talkState[talkUser] = 0
end
elseif msgcontains(msg, "yes") and talkState[talkUser] == 6 then
if isMarried(cid) then
if doPlayerRemoveMoney(cid, marry_config.Divorce_Price) then
npcHandler:say("Congratulations, you end up divorcing from player: "..getPartner(cid), cid)
setPlayerStorageValue(cid, 150420, -1)
setPlayerStorageValue(cid, marry_config.storage3, -1)
pguid = getPlayerGUIDByName(getPartner(cid))
if Ponline(pguid) then
setPlayerStorageValue(getPlayerByNameWildcard(getPlayerNameByGUID(pguid)), 150420, -1)
else
db.executeQuery("DELETE FROM `player_storage` WHERE `player_id` = " .. pguid .. " AND `key` = 150420;")
end
doDivorcePlayer(cid)
else
npcHandler:say("Sorry, you do not have "..marry_config.Divorce_Price.." gp(s).", cid)
end
else
npcHandler:say("you are not married.", cid)
end
elseif msgcontains(msg, "yes") and talkState[talkUser] == 7 then
npcHandler:say("Congratulations, you end up divorcing.", cid)
setPlayerStorageValue(cid, marry_config.storage3, -1)
elseif msg == "no" and talkState[talkUser] >= 1 then
selfSay("tudo bem então.", cid)
talkState[talkUser] = 0
npcHandler:releaseFocus(cid)
end
return TRUE
end
npcHandler:setCallback(CALLBACK_MESSAGE_DEFAULT, creatureSayCallback)
npcHandler:addModule(FocusModule:new())

configuration:

marry_config = {
OnlyDifferentSex = false, -- it must be of the opposite sex?
Marry_Price = 300000, -- how much it will cost the marriage proposal
Divorce_Price = 100000, -- how much it will cost divorce
Level = 50, -- level that need to be married
MaxSqm = 7, -- here is how many sqm they need to be near each other to get married
Text = {'I love you!','My love!','Baby dear!'}, -- That phrases go out when marry
RingID = 10502, -- id ring that will receive
TimeAccept = 60, -- time that the player has to accept the marriage proposal
storage1 = 300235, -- don't edit
storage2 = 300236, -- don't edit
storage3 = 300237 -- don't edit
}
[/I][/I][/I][/I][/I]
 
Last edited by a moderator:
where is the line where u can remove the give outfit part!
I dont want so they can receive the weeding outfit :)
 
where is the line where u can remove the give outfit part!
I dont want so they can receive the weeding outfit :)

here add outfit:

Code:
setPlayerStorageValue(getPlayerByNameWildcard(getPlayerNameByGUID(players[i])), 150420, 1)


here remove outfit:
Code:
setPlayerStorageValue(cid, 150420, -1) -- remove cid

-- remove patner outfit
if Ponline(pguid) then
setPlayerStorageValue(getPlayerByNameWildcard(getPlayerNameByGUID(pguid)), 150420, -1)
else
db.executeQuery("DELETE FROM `player_storage` WHERE `player_id` = " .. pguid .. " AND `key` = 150420;")
end
 
TFS 0.4

If anyone got that problem:
Code:
[19:42:04.550] mysql_real_query(): INSERT INTO `marriage_system` (`player_id`, `partner`, `marriage_date`) VALUES ('15', '12', '1345743724'); - MYSQL ERROR: Duplicate entry '0' for key 'PRIMARY' (1062)

[19:42:04.550] [Error - NpcScript Interface]
[19:42:04.550] data/npc/scripts/celest.lua:onCreatureSay
[19:42:04.550] Description:
[19:42:04.550] data/lib/004-database.lua:76: [Result:getDataString] Result not set!
[19:42:04.550] stack traceback:
[19:42:04.550]  [C]: in function 'error'
[19:42:04.550]  data/lib/004-database.lua:76: in function 'getDataString'
[19:42:04.550]  [string "..."]:51: in function 'getPartner'
[19:42:04.550]  data/npc/scripts/celest.lua:67: in function 'callback'
[19:42:04.566]  data/npc/lib/npcsystem/npchandler.lua:385: in function 'onCreatureSay'
[19:42:04.566]  data/npc/scripts/celest.lua:8: in function <data/npc/scripts/celest.lua:8>

Enter to your database in phpmyadmin, delete table marriage_system then write it to SQL:
Code:
CREATE TABLE marriage_system (
                        player_id   INTEGER NOT NULL,
                        partner   VARCHAR( 255 )  NOT NULL,
                        marriage_date INTEGER NOT NULL,
                        PRIMARY KEY ( player_id )
);
 
Hey ill test this script and
it dont change from single to Marriage with [playername] on the homepage

can someone help me to Edit my script so it work in Gesior

PHP:
 if($config['site']['show_marriage_info']) 
            { 
                if(is_int($number_of_rows / 2)) { $bgcolor = $config['site']['darkborder']; } else { $bgcolor = $config['site']['lightborder']; } $number_of_rows++; 
                $main_content .= '<TR BGCOLOR="'.$bgcolor.'"><TD>Marital status:</TD><TD>'; 
                $marriage = new OTS_Player(); 
                $marriage->load($player->marriage); 
                if($marriage->isLoaded()) 
                    $main_content .= 'married to <a href="?subtopic=characters&name='.urlencode($marriage->getName()).'"><b>'.$marriage->getName().'</b></a></TD></TR>'; 
                else 
                    $main_content .= 'single</TD></TR>'; 
            }

in config

PHP:
$config['site']['show_marriage_info'] = 1;


Btw Nice Thread :) thanks

- - - Updated - - -

Can you Release Creatuescripts to ? so they can se "he is marriage with [playername]" ? :)
 
change

Code:
doPlayerSetSpecialDescription(thing.uid,'.\n'..(getPlayerSex(thing.uid) == 0 and 'She' or 'He')..' is married to '..getPartner(thing.uid))

to
Code:
doPlayerSetSpecialDescription(thing.uid,'.\n'..(getPlayerSex(thing.uid) == 0 and 'She' or 'He')..' is marriage with ['..getPartner(thing.uid)..'].')
 
replace $player->marriage with $player->getMarriage()

or not, this isn't compatible with this custom system
 
Thank you very much / Vielen danke / gratia / gratze / Obrigado .
you're really good !!!
by the way to who wanna add me, my skype is gil7001x and yes I have an Open Tibia server.
(sorry if I can't say my skype name here, if not, you admins can delete the post but don't ban me pls)
 
by the way to who wanna add me, my skype is gil7001x and yes I have an Open Tibia server.
(sorry if I can't say my skype name here, if not, you admins can delete the post but don't ban me pls)

I think it's not a crime to put your skype here to contact with you, but if someone don't know you, don't have any reason to join your skype.
 
Dont show marry status in gesior acc :s help me please

Lua:
			if(is_int($number_of_rows / 2)) { $bgcolor = $config['site']['darkborder']; } else { $bgcolor = $config['site']['lightborder']; } $number_of_rows++;
				$main_content .= '<TR BGCOLOR="'.$bgcolor.'"><TD>Marital status:</TD><TD>';
				$marriage = new OTS_Player();
				$marriage->load($player->getMarriage());
				if($marriage->isLoaded())
					$main_content .= 'married to <a href="?subtopic=characters&name='.urlencode($marriage->getName()).'"><b>'.$marriage->getName().'</b></a></TD></TR>';
				else
					$main_content .= 'single</TD></TR>';
 
sorry to shovel this post. but i have any error.
primo sorry for my bad english :).

Lua:
[16:41:21.391] [Error - NpcScript Interface]
[16:41:21.391] data/npc/scripts/marriagesystem.lua:onCreatureSay
[16:41:21.391] Description:
[16:41:21.391] [string "..."]:54: attempt to call field 'executeQuery' (a nil value)
[16:41:21.391] stack traceback:
[16:41:21.391]  [string "..."]:54: in function 'doMarry'
[16:41:21.391]  data/npc/scripts/marriagesystem.lua:64: in function 'callback'
[16:41:21.391]  data/npc/lib/npcsystem/npchandler.lua:390: in function 'onCreatureSay'
[16:41:21.391]  data/npc/scripts/marriagesystem.lua:8: in function <data/npc/scripts/marriagesystem.lua:8>

i have tfs 0.4 dev..

please help me ;D
 
Back
Top