Ir para conteúdo

New Marriage System


Mulizeu

Posts Recomendados

Sobre: É um sistema de casamento entre players, o diferencial do sistema é que eles podem upar o level do seu casamento(sistema), para isso eles terão que caçar juntos, também caçando junto eles recebem alguns bônus.

 

Sistema: O sistema tem stages, ou seja, a medida que o level do casamento ir aumentando, mais difícil vai ficar para alcançar o próximo nível do sistema, para aumentar o nível do sistema, eles terão que estar perto um do outro, então vão acumulando "marry exp", que é a exp do casamento.

 

Dependendo do level do casamento os jogadores vão ganhar um bônus experience(caso estiverem juntos), é por stages também, tudo configurável.

 

O casal não poderá se atacar, já que vão estar upando junto muitas vezes.

 

Também para não dar lag, na db fica salvo o casal, não os dois jogadores, isso quer dizer que se 10 jogadores casam, na db fica salvo só 5 colunas, compacta, e a exp do player é por storage, nada por db, para não lagar.

 

Bônus: Além da exp bônus para o casal, eles terão chances de conseguir dois "bufs" especiais:

 

1° [Reflect] - Chance de ser refletido o damage do monstro em 50%

2° [Couple Damage] - O casal compartilha da mesma dor, isso faz com que o dano recebido seja divido entre o casal.

 

Claro que os buffs só serão dados se ambos estiverem junto.

 

Comandos:

 

!marriage info -- mostra em uma janela informações sobre o sistema

!marriage status -- caso jogador for casado, mostra o status do casamento(exp,level, casado)

!marriage date -- mostra a data do casamento

!marriage accept -- para aceitar o convite de um casamento

!marriage reject -- para rejeitar o convite de um casamento

!marriage NAME -- isso faz com que você peça um jogador em casamento ex: !marriage mulizeu

!divorce -- para se divorcia do seu casamento

 

 

Screns:

 

 

gZn8V.png

Uma mensagem na parte inferior da tela, dizendo quanto de "marry exp" ganhou no monstro que matou

rmyfl.png

comando !marriage info, faz com que monstre a informações do sistema, preços do casamento, divócio, level, etc..

wWCxK.png

comando !marriage status mostra o status do casamento do player, quando de "marry exp" para o próximo nível, etc...

EAUHd.png

Look que mostra com quem é casado e nível do casamento.

b0HF9.png

o buff "Couple damage"

apJVe.png

O buff "reflect damage"

 

 

 

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

 

Mods

 

MarriageSystem.xml

<?xml version="1.0" encoding="UTF-8"?>  
<mod name="MarriageSystem" version="1.0" author="Mulizeu" contact="xtibia.com" enabled="yes">  
<config name="marry_func"><![CDATA[
marry_config = {
Premium = false,
OnlyDifferentSex = false,
Marry_Price = 300000,
Divorce_Price = 100000,
Level = 50,
MaxSqm = 7 -- to up system and win bonus
}
Marry_stage = {
[0] = {exp = 350000, marry_percent = 50, player_experience = 0},
[1] = {exp = 700000, marry_percent = 45, player_experience = 2},
[2] = {exp = 1050000, marry_percent = 40, player_experience = 4},
[3] = {exp = 1400000, marry_percent = 35, player_experience = 6},
[4] = {exp = 1750000, marry_percent = 30, player_experience = 8},
[5] = {exp = 2100000, marry_percent = 25, player_experience = 10},
[6] = {exp = 2450000, marry_percent = 20, player_experience = 12},
[7] = {exp = 2800000, marry_percent = 15, player_experience = 14},
[8] = {exp = 3150000, marry_percent = 10, player_experience = 16},
[9] = {exp = 3500000, marry_percent = 5, player_experience = 18},
[10] = {exp = 0, marry_percent = 0, player_experience = 20}
}
marriage_tabble = {exp = 350250,level = 340200}
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 isMarryOnline(cid)
if not getPlayerByNameWildcard(getPartner(cid)) then
return false
end
return true
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
if(not player or isPlayerGhost(player)) then
db.executeQuery("DELETE FROM `player_storage` WHERE `player_id` = " .. pid .. " AND `key` = " .. marriage_tabble.level .. ";")
db.executeQuery("DELETE FROM `player_storage` WHERE `player_id` = " .. pid .. " AND `key` = " .. marriage_tabble.exp .. ";")
else
setPlayerStorageValue(player, marriage_tabble.level,0)
setPlayerStorageValue(player, marriage_tabble.exp,0)
end
return db.executeQuery("DELETE FROM `marriage_system` WHERE `player_id` = '" .. pid .. "';")
end
function getMarryStatus(cid, status)
player = isPatner(cid) and getPlayerByNameWildcard(getPartner(cid)) or cid
return getPlayerStorageValue(player,status == "level" and marriage_tabble.level or marriage_tabble.exp) < 0 and 0 or getPlayerStorageValue(player, status == "level" and marriage_tabble.level or marriage_tabble.exp)
end
function setMarryStatus(cid, status, amount)
player = isPatner(cid) and getPlayerByNameWildcard(getPartner(cid)) or cid
return setPlayerStorageValue(player, status == "level" and marriage_tabble.level or marriage_tabble.exp, getMarryStatus(player, status)+amount)
end
function getMarryExp(cid)
return getMarryStatus(cid, "exp")
end
function addMarryExp(cid, amount)
return setMarryStatus(cid, "exp", amount)
end
function addMarryLevel(cid, amount)
return setMarryStatus(cid, "level", amount)
end
function getMarryLevel(cid)
return getMarryStatus(cid, "level")
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;!divorce;/divorce" event="buffer"><![CDATA[
domodlib('marry_func')
config = {TimeAccept = 30, sqm = 3, storage1 = 873438, storage2 = 532579}
if words =="!marriage" or words =="/marriage" then
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
msg = "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 bonus exp as a wedding gift given by the union".."\n\nThis bonus is only given if the married players are nearby.\n\nTo marry use the command:\n!marriage NAME"
doShowTextDialog(cid,2160,msg)
elseif(param == "status") then
if isMarried(cid) then
msg = "Marriage Status".."\n\nMarried with: ["..getPartner(cid).."]\n\nMarry Experience: "..(getMarryLevel(cid) ~= 10 and "["..getMarryExp(cid).."/"..Marry_stage[getMarryLevel(cid)].exp.."]" or "[Max]").."\n\nMarry Level: "..(getMarryLevel(cid) ~= 10 and "["..getMarryLevel(cid).."]" or "[Max]").."\n"
else
msg = "you are not married"
end
doPlayerPopupFYI(cid, msg)
elseif (param =="date") then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE,""..(isMarried(cid) and "The date of his marriage with "..getPartner(cid).." was: "..getMarryDate(cid).."." or "you are not married.").."")
elseif (param =="accept") then
player = getPlayerStorageValue(cid, config.storage2)
if getPlayerStorageValue(cid, config.storage1) >= os.time() then
if not isMarried(cid) then
if getDistanceBetween(getCreaturePosition(cid), getCreaturePosition(player)) <= config.sqm then
doMarry(cid, getPlayerGUID(player))
doPlayerSendTextMessage(player, MESSAGE_STATUS_CONSOLE_ORANGE,"Congratulations! "..getCreatureName(cid).." accepted his marriage proposal.")
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"Congratulations! you married with "..getCreatureName(player))
doSendMagicEffect(getCreaturePosition(cid), 35)
doSendMagicEffect(getCreaturePosition(player), 35)
else
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "you're far away from her suitor.")
end
else
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE,"you are not married.")
end
else
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE,"you do not received none wedding invitation.")
end
elseif (param =="reject") then
if getPlayerStorageValue(cid, config.storage1) >= os.time() then
if not isMarried(cid) then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"You just refuse the wedding invitation from player "..getCreatureName(getPlayerStorageValue(cid, config.storage2)))
doPlayerSendTextMessage(getPlayerStorageValue(cid, config.storage2), MESSAGE_STATUS_CONSOLE_ORANGE,getCreatureName(cid).." rejected his marriage proposal.")
else
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE,"you are already married.")
end
else
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE,"you do not received none wedding invitation.")
end
else
local player = getPlayerByNameWildcard(param)
if(not player)then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, param.." is offline or does not exist.") return true
elseif isMarried(cid) or isMarried(player) then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, ""..(isMarried(cid) and "you" or "he").." already is wedded.") return true
elseif marry_config.Premium == true then
if not isPremium(cid) or not isPremium(Player) then doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "players must be premium") end
return true  
elseif getPlayerLevel(cid) < marry_config.Level or getPlayerLevel(player) < marry_config.Level then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "players must to be level "..marry_config.Level) return true
elseif getPlayerStorageValue(player, config.storage1) >= os.time() then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, param.." already have a wedding invitation, wait.") return true
elseif getDistanceBetween(getCreaturePosition(cid), getCreaturePosition(player)) > config.sqm then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "you are far away from each other to get married.") return true
elseif marry_config.OnlyDifferentSex and getPlayerSex(cid) == getPlayerSex(player) then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "you can only marry the opposite sex") return true
elseif not doPlayerRemoveMoney(cid, marry_config.Marry_Price) then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE, "Sorry, but you do not have "..marry_config.Marry_Price.." gp(s) to ask "..param.." in marriage.") return true
end
setPlayerStorageValue(player, config.storage1,os.time()+config.TimeAccept)
setPlayerStorageValue(player, config.storage2, cid)
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE,"you asked "..param.." in marriage, wait a answer!")
doPlayerSendTextMessage(player, MESSAGE_STATUS_CONSOLE_BLUE,getCreatureName(cid).." asked you in marriage, enter !marriage accept or !marriage reject")
end
elseif words =="!divorce" or words =="/divorce" then
if isMarried(cid) then
if doPlayerRemoveMoney(cid, marry_config.Divorce_Price) then
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_ORANGE,"Congratulations, you end up divorcing from player: "..getPartner(cid))
doDivorcePlayer(cid)
else
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE,"Sorry, you do not have "..marry_config.Divorce_Price.." gp(s).")
end
else
doPlayerSendTextMessage(cid, MESSAGE_STATUS_CONSOLE_BLUE,"you are not married.")
end
end
return true
]]></talkaction>
<event type="login" name="MarryRegister" event="script"><![CDATA[
function onLogin(cid)
registerCreatureEvent(cid, "ExpMarry")
registerCreatureEvent(cid, "MarryLook")
registerCreatureEvent(cid, "MarryStats")
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, "\nMarried with "..getPartner(thing.uid).." - [Nv: " .. getMarryLevel(thing.uid) .."]\n")
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>
<event type="kill" name="ExpMarry" event="script"><![CDATA[
domodlib('marry_func')
function onKill(cid, target, lastHit)
if isMonster(target) then
conta = getMonsterInfo(string.lower(getCreatureName(target))).experience
if isMarried(cid) and isMarryOnline(cid) and getDistanceBetween(getCreaturePosition(cid), getCreaturePosition(getPlayerByNameWildcard(getPartner(cid)))) <= marry_config.MaxSqm then
if getMarryLevel(cid) ~= 10 then
mexp = math.ceil((conta*Marry_stage[getMarryLevel(cid)].marry_percent)/100)
addMarryExp(cid, mexp)
if isMarryOnline(cid) then
doPlayerSendTextMessage(getPlayerByNameWildcard(getPartner(cid)),MESSAGE_STATUS_SMALL,"Marry exp + "..mexp)
end
doPlayerSendTextMessage(cid,MESSAGE_STATUS_SMALL,"Marry exp + "..mexp)
if getMarryExp(cid) >= Marry_stage[getMarryLevel(cid)].exp then
addMarryLevel(cid, 1)
if isMarryOnline(cid) then
doPlayerSendTextMessage(getPlayerByNameWildcard(getPartner(cid)), MESSAGE_STATUS_CONSOLE_RED,"[Marriage System] Level Up! [Nv: "..getMarryLevel(cid).."].")
doSendMagicEffect(getCreaturePosition(getPlayerByNameWildcard(getPartner(cid))), 35)
end
doPlayerSendTextMessage(cid,MESSAGE_STATUS_CONSOLE_RED,"[Marriage System] Level Up! [Nv: "..getMarryLevel(cid).."].")
doSendMagicEffect(getCreaturePosition(cid), 35)
end
end
local exp = getExperienceStage(getPlayerLevel(cid), getVocationInfo(getPlayerVocation(cid)).experienceMultiplier)
local count = math.ceil(((getMonsterInfo(string.lower(getCreatureName(target))).experience*exp)*Marry_stage[getMarryLevel(cid)].player_experience)/100)
doPlayerAddExperience(cid, count)
end
end
return true
end]]></event>
<event type="statschange" name="MarryStats" event="script"><![CDATA[
domodlib('marry_func')
Damage_percent = 50 -- metade n mexa
Chance = 25 -- chance de conseguir o reflect ou couple damage
if isMonster(attacker) and type == STATSCHANGE_HEALTHLOSS then
if isMarried(cid) and isMarryOnline(cid) and getPlayerByNameWildcard(getPartner(cid)) and getDistanceBetween(getCreaturePosition(cid), getCreaturePosition(getPlayerByNameWildcard(getPartner(cid)))) <= marry_config.MaxSqm then
if (Chance > math.random(1, 100)) then
damage = math.ceil((value*Damage_percent)/100)
if (50 > math.random(1, 100)) then
doTargetCombatHealth(cid, attacker, COMBAT_PHYSICALDAMAGE, -damage, -damage, CONST_ME_HOLYDAMAGE)
doSendAnimatedText(getCreaturePosition(cid), "REFLECT!", 140)  
else
doSendMagicEffect(getCreaturePosition(cid), CONST_ME_HEARTS)
doSendAnimatedText(getCreaturePosition(cid), "Love!", 200)
doCreatureAddHealth(cid, damage)
if isMarryOnline(cid) then
doSendMagicEffect(getCreaturePosition(getPlayerByNameWildcard(getPartner(cid))), CONST_ME_HEARTS)
doSendAnimatedText(getCreaturePosition(getPlayerByNameWildcard(getPartner(cid))), "Love!", 200)   
doCreatureAddHealth(getPlayerByNameWildcard(getPartner(cid)), -damage)
end
end
end
end
end
return true
]]></event>
</mod>

 

 

Configuração:

 

marry_config = {

Premium = false, -- se o jogador precisa ser premium para casar

OnlyDifferentSex = false, -- se precisa ser do sexo oposto

Marry_Price = 300000, -- qnto 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 ganha exp, bonus, etc...

}

 

 

Marry_stage = {

[0] = {exp = 350000, marry_percent = 50, player_experience = 0},

[1] = {exp = 700000, marry_percent = 45, player_experience = 2},

[2] = {exp = 1050000, marry_percent = 40, player_experience = 4},

[3] = {exp = 1400000, marry_percent = 35, player_experience = 6},

[4] = {exp = 1750000, marry_percent = 30, player_experience = 8},

[5] = {exp = 2100000, marry_percent = 25, player_experience = 10},

[6] = {exp = 2450000, marry_percent = 20, player_experience = 12},

[7] = {exp = 2800000, marry_percent = 15, player_experience = 14},

[8] = {exp = 3150000, marry_percent = 10, player_experience = 16},

[9] = {exp = 3500000, marry_percent = 5, player_experience = 18},

[10] = {exp = 0, marry_percent = 0, player_experience = 20}

}

 

[LEVEL DO CASAMENTO] = {

 

exp = Quanto de exp precisa pra avançar de nível do casamento

 

marry_percent = quanto de exp eles receberão a matar um montro, por exemplo, no level 0 eles matando um demon que de digamos dê 6000 de exp, eles irão ganhar 50% de 6000, que fica 3000 para o sistema de casamento.

 

player_experience = bônus exp em % para os players que estiverem upando junto, varia o level do casamento, no level 10, que é o máximo, se eles uparem junto vão receber bônus de 20% experience.

 

CREDITOS : 25% Ao vodkart pela lib e 75% ao mulizeu(eu) Pelos demais scripts

Editado por mulizeu
Link para o comentário
Compartilhar em outros sites

Tenho umas perguntas:

Precisa de level minimo para casar? Se não, poderia por, porque pensa:

Tenho um Druid level 50, vo caçar demon, vo criar um char female knight, pra dividir os danos ;D

 

Mas sei lá, só uma sugestão, mas o script é bem bolado, de um modo geral, ele faz mesmo um sistema cooperativo entre o casal.

Adorei! REP+

Link para o comentário
Compartilhar em outros sites

Extremamente bom o sistema, mais acho que 25 só dos creditos ao vod ta errado, mais tudo bem, perfeito.

 

Justo, pois eu só fiz a lib, ele que fez o resto do sistema, e ficou excelente amigo.

Obrigado por compartilhar, irei usar o sistema xD

ta lindo

abraços

 

@up

 

precisa ter level sim, você configura aqui:

 

 

Level = 50,

Editado por Vodkart
Link para o comentário
Compartilhar em outros sites

Eu não entendi a parte de executar na DB '-'

 

 

1° Abra o programa Sqlite

2° selecione sua db( Eu tenho o servidor baiak aqui e eu vou abrir o arquivo forgottenserver.s3db,pode ser outro nome,mas o arquivo é esse ".s3db")

3° na parte superior do programa tem a aba "Tools",clica nela e seleciona "Open SQL query editor" ou (ALT + E) se preferir

4° Vai abrir uma janela branca,nela você coloca isso:

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

5° Depois clica no ícone do raio ali na parte de cima ou aperta o botão F9 que vai fazer com que a query seja executada.

Link para o comentário
Compartilhar em outros sites

  • 2 weeks later...

ótimo sistema, porém não vou usar por que eu acho meio estranho por talkactions. Um casamento sem padre? kkk. RESPUTADO.

Link para o comentário
Compartilhar em outros sites

  • 4 weeks later...
×
×
  • Criar Novo...