ID:159135
 
I am looking for a way to integrate clans/guilds into my game Rintai. As i am a fairly new coder, i need help making a system that can be used simply. I want to be able to have a play goto an NPC give him some cash, and vwalah!
The best way to make guilds is by using datums.
You should try an approach like the following:

var/list/guilds

guild
var
name //name of the guild
list
members //list of guild_member objects by ckey
online //list of mobs currently in this guild that are online
proc
Login(mob/player/M) //called when a player logs in to this guild
if(!istype(M)) return
M.guild = src
M.guild_member = members[M.ckey]
if(!online) online = new/list()
online += M
Logout(mob/player/M) //called when a player has logged out from this guild
if(!istype(M)) return
M.guild = null
M.guild_member = null
online -= M
if(!online.len) online = null
Disband()
for(var/mob/player/M in online) Logout(M)
guilds -= src
if(!guilds.len) guilds = null
del src
New(name, mob/player/founder)
. = ..()
if(name) src.name = name
if(founder)
if(!members) members = new/list()
//add the guild leader as a member with is_founder set to 1
members[founder.ckey] = new/guild_member{is_founder=1}(founder.key, "Guild Leader")
Login(founder)
verb //these do not apply to a specific guild, so "src" is not valid here
guild_chat(t as text)
var/mob/player/M = usr
if(!istype(M) || !t || !M.guild || !M.guild_member) return
if(length(t) > 1200) t = copytext(t, 1, 1201)
t = html_encode(t)
for(var/mob/player/N in M.guild.online)
N << "<em>(guild chat) [M.name] ([M.guild_member.rank]): [t]</em>"
guild_invite(mob/player/M in oview(1, usr))
if(!istype(M)) return
var/mob/player/N = usr
if(!istype(N) || !N.guild || !N.guild_member || !N.guild_member.is_founder) return
if(alert(M, "Would you like to join this guild?", "Guild", "Yes", "No") == "Yes")
for(N in M.guild.online)
N << "<em>(guild info) [M.name] has joined the guild.</em>"
members[M.ckey] = new/guild_member(M.key)
Login(M)
guild_leave()
var/mob/player/M = usr
if(!istype(M) || !M.guild || !M.guild_member) return
if(M.guild_member.is_founder)
M << "<em>(guild info) Founders cannot leave a guild.</em>"
return
var/guild/G = M.guild
Logout(M)
members -= M.ckey
for(var/mob/N in G.online)
N << "<em>(guild info) [M.name] has left the guild.</em>"
guild_kick(var/X in members)
...

guild_member
var
name //key of the member
ckey //ckey of the member
rank = "No rank" //rank
is_founder = 0 //1 if we are the founder of this guild. Founders may disband the guild, and invite / kick members
New(name, rank)
if(name)
src.name = name
src.ckey = ckey(name)
if(rank) src.rank = rank

mob/player
var
tmp //declaring these two as /tmp will prevent them from saving with the player
guild/guild
guild_member/guild_member
gold = 250
Login()
. = ..()
//loop through all the guilds, and call Login() on the one we're a member of
for(var/guild/G in guilds)
if(ckey in G.members)
G.Login(src)
break
Logout()
if(guild) guild.Logout(src)
...

mob/guildmaster
Click()
var/mob/player/M = usr
if(!istype(M)) return
if(M.guild)
if(M.guild_member.is_founder)
if(alert(M, "Would you like to disband your guild?", "Guild Master", "Yes", "No") == "Yes")
M.guild.Disband()
else
alert(M, "You are already in a guild. You can only be in one guild.", "Guild Master")
return
if(alert(M, "For 500 gold I will spread the word of your guild.\n\
Would you like to form a guild?"
, "Guild Master", "Yes", "No") == "Yes")
var/name = input(M, "What is the name of the guild you would like to create?", "Guild Master") as null|text
if(name == null) //the player clicked "Cancel"
return
... //perform name handling here: strip HTML, check if it's not a large wall of text, etc.
if(!guilds) guilds = new/list()
guilds += new/guild(name, M)