Vodk 37 Postado Novembro 17, 2015 Share Postado Novembro 17, 2015 Atualização: Retirado bug de não conseguir se divorciar Retirado bug do NPC não responder após o pedido ser feito. Retirado outros vários bugs que não to afim de digitar. Introdução: É o sistema de casamento conhecido, porém foi reformulado para funcionar em versões mais recentes. O sistema contém: Item: Os jogadores que se casar receberão um Wedding ring com seus nomes e data do casamento. Outfit: jogadores que se casam recebem outfit, caso se divorciem, perder as outfits. Look: o look mostra com quem é casado. Comandos: /marriage info -- mostra em uma janela o preço do casamento/divórcio e o level minimo para casar. /marriage status -- mostra com quem é casado e a data do casamento. Sobre o divorcio: não é preciso que, para se divorciar, os 2 players casados estejam online. Exemplo: JOÃO e casado com MARIA, JOÃO vai até o npc e paga um preço para de divorciar, só quem pede o divorcio que paga a taxa, logo MARIA não precisa pagar nada pois seu Ex-Patner JOÃO já pagou. O que ela precisa fazer é "assinar" com o npc o seu divorcio também. Como casar? Player que vai pedir (1): Player que vai aceitar (2): Na sua db execute: 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 ) ); Caso você ter e querer a outfit Husband e Wife(de casamento) no seu servidor, vá na pasta Data > Xml > outfits.xml e adicione isso na outfit: quest="150420" que irá ficar assim: <outfit id="23" quest="150420"> <list gender="0" lookType="329" name="Wife"/> <list gender="1" lookType="328" name="Husband"/> </outfit> Mods: MarriageSystem.xml <?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 = 30, 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: Em Npc/Data Celest.xml <?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 domodlib('marry_func') local keywordHandler = KeywordHandler:new() local npcHandler = NpcHandler:new(keywordHandler) NpcSystem.parseParameters(npcHandler) local talkState = {} function onCreatureAppear(cid) npcHandler:onCreatureAppear(cid) end function onCreatureDisappear(cid) npcHandler:onCreatureDisappear(cid) end function onCreatureSay(cid, type, msg) npcHandler:onCreatureSay(cid, type, msg) end function onThink() npcHandler:onThink() 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()) Configuração: marry_config = { OnlyDifferentSex = false, -- se precisa ser do sexo oposto Marry_Price = 300000, -- quanto vai custar o pedido de casamento Divorce_Price = 100000, -- quanto vai custar o divórcio Level = 50, -- que level precisa ser para casar MaxSqm = 7, -- aqui é quantos sqm eles precisam estar perto um do outro para se casar Text = {'I love you!','My love!','Baby dear!'}, -- frases que vão sair ao se casar RingID = 10502, -- id do ring que receberão ao se casar TimeAccept = 30, -- tempo que o jogador tem para aceitar o pedido de casamento storage1 = 300235, -- n mexa storage2 = 300236, -- n mexa storage3 = 300237 -- n mexa } Alguns membros pediram pra traduzir para o português mas poderia dar conflito em alguns servers. Link para o comentário Compartilhar em outros sites More sharing options...
SkyLigh 453 Postado Novembro 17, 2015 Share Postado Novembro 17, 2015 Bem criativo, parabéns. Link para o comentário Compartilhar em outros sites More sharing options...
Deadpool 862 Postado Novembro 17, 2015 Share Postado Novembro 17, 2015 Qual versão usada/testada? Gostei haha! Link para o comentário Compartilhar em outros sites More sharing options...
Vodk 37 Postado Novembro 17, 2015 Autor Share Postado Novembro 17, 2015 Qual versão usada/testada? Gostei haha! os prints foram tirados há um tempo, tfs 0.3.6. Link para o comentário Compartilhar em outros sites More sharing options...
Deadpool 862 Postado Novembro 17, 2015 Share Postado Novembro 17, 2015 Me ensina a executar os comandos na DB, eu nunca mexi com ela '- Link para o comentário Compartilhar em outros sites More sharing options...
Vodk 37 Postado Novembro 17, 2015 Autor Share Postado Novembro 17, 2015 Me ensina a executar os comandos na DB, eu nunca mexi com ela '- 1° Abra o programa Sqlite 2° Selecione a database do seu server, por exemplo o "forgottenserver.s3db" 3° na parte superior do programa tem a aba "Tools",clica nela e seleciona "Open SQL query editor" (ALT+E) 4° vai abrir uma janela em branco e você coloca o comando 5° depois de ter feito isso, clica no ícone do raio na parte de cima ou aperta f9 que a query vai ser executada. Link para o comentário Compartilhar em outros sites More sharing options...
Deadpool 862 Postado Novembro 17, 2015 Share Postado Novembro 17, 2015 E se eu usar site? haha! Link para o comentário Compartilhar em outros sites More sharing options...
Vodk 37 Postado Novembro 17, 2015 Autor Share Postado Novembro 17, 2015 (editado) . @ vou arrumar Editado Novembro 17, 2015 por Vodk Link para o comentário Compartilhar em outros sites More sharing options...
TaaG 63 Postado Novembro 17, 2015 Share Postado Novembro 17, 2015 Grande Vodkart!!Belo script. Link para o comentário Compartilhar em outros sites More sharing options...
Administrador Administrador 1434 Postado Novembro 17, 2015 Administrador Share Postado Novembro 17, 2015 Ótimo script ! Link para o comentário Compartilhar em outros sites More sharing options...
Deadpool 862 Postado Novembro 17, 2015 Share Postado Novembro 17, 2015 Vodkart? Sério? Oo Link para o comentário Compartilhar em outros sites More sharing options...
Krono 128 Postado Novembro 17, 2015 Share Postado Novembro 17, 2015 Como sempre ótimo script, sem mas. Link para o comentário Compartilhar em outros sites More sharing options...
dyego2008 149 Postado Novembro 17, 2015 Share Postado Novembro 17, 2015 Como esperado de você, rep++ pelo belo script Link para o comentário Compartilhar em outros sites More sharing options...
GOD Vitor 66 Postado Novembro 19, 2015 Share Postado Novembro 19, 2015 (editado) Tá dando esse erro, quando eu peço o outro player em casamento, e respondo com o outro players com os 2 players online, quando eu falo proceed, o npc n responde nada. Tipo, os 2 noivos recebem o anel e tals, só n recebem a outfit e nem fica no look lá mostrando com quem é casado. Editado Novembro 19, 2015 por GOD Vitor Link para o comentário Compartilhar em outros sites More sharing options...
Vodk 37 Postado Novembro 19, 2015 Autor Share Postado Novembro 19, 2015 no momento não está atualizado pra servidores derivados, vou arrumar isso hoje.testei em um dbo e deu o mesmo erro, quando eu atualizar vou editar o post. Link para o comentário Compartilhar em outros sites More sharing options...
Posts Recomendados