Jump to content

Leaderboard

Popular Content

Showing content with the highest reputation on 07/27/16 in all areas

  1. GRF Editor: Encryption The Movie Hello again, rAthena, I'm Haziel. I'm a Pixel Artist and also a Scripter. (Also, you can check my work here and here, and if you ever need any Sprite/Script Service, check here! You can also add me on skype (it's on my signature)) Most of the people who know me or hired me for any kind of service know that I don't charge more than it's fair. What upsets me is the people who use my work without authorization, most of the cases, paid material that took hours, days or, sometimes, weeks to be concluded. So, hoping to protect my work, and the custom content of your servers' owners, I've decided to write a guide explaning in detail how to use @Tokei's awesome tool. 1. List of Materials • GRF Editor, if you're not familiar with this software, it is the best GRF Management Tool ever coded. • The files you want to protect, the encryption is made by file so, there's no need to encrypt the whole GRF. • Your Hexed must be 2012-04-10 or above, it won't work on 2010 Clients. • Decide your Hexed filename, it's essential for the encryption to work. 2. Generating Encryption Key GRF Editor uses a Key Encryption Method, what means that your protection is based on a password. Choose a password you'll remember or note it somewhere, you won't be able to decrypt your files without it and always save a Backup of the files you'll encrypt. Password chosen, you'll need to generate the DLL, the one that will allow your Client to read encrypted files. Open the GRF Editor and navigates on the top menu to Tools > GRF Encryption, you'll see the window below. First, Input your Key on the Encryption Password field. Next, select your Client on the Client Path field, it is needed for the DLL to be coded to its filename or be modified if needed. IMPORTANT: The Client being asked here is for the Hexed, IT IS NOT the Patcher, Launcher or Loader. The name of the DLL can also be changed, it will output a modified Hexed of ready to read it. With everything set, click in Generate File(s), and it will pop up a folder where your DLL has been generated, add/replace the one in your Client folder. 3. Encrypting Files Files can now be encrypted. Open your GRF, GPF or THOR, select the files you want to protect. Right-click it and select EncryptIon > Encrypt. Enter the Password you previously defined, confirm and the file will be highlighted in Orange. The colour might not show up when you're working on a THOR file or opens a GRF/THOR previously encrypted, that's normal behavior. Once the GRF or THOR is saved, you won't be able to read the file. Normally an error will pop, but you can test it ingame, if you've done it correctly, it will be displayed properly. As far as I've tested, the Encrypted Files works in the DATA folder if extracted. If you want to Encrypt or Decrypt a whole GRF, you can select Tools > GRF Encryption with the GRF open by the software and choose the options Encrypt GRF or Decrypt GRF. You will be asked for the Key, and then It'll run the process through the entire GRF and export it to a new folder. The same process can be made with THOR files, even if it displays any reading error, patched Encrypted files will work. I hope that's clear enough and that it may help you. Post any question you may have in the comments below and I'll try to help. My best regards, Haziel
    1 point
  2. Hello everyone! I'd just like to show off something I've worked on as a pet project that was finally released at RebirthRO a couple of months ago, which is fully working achievements and titles. When you get an achievement, the black-bar appears along with an Angeling that appears over your head (like the level up angel), both display only for you. That's all packet related, so no real extra work required there. Then there is the achievement window in game that has full functionality. It took a little while to get the packets working, since the only dumps I could find were out of date, but it was worth it in the end. It's surprisingly robust and easy to use, unlike other aspects of RO. The whole achievement system consists of only two packets. Of note is that the Title, Buff and Item rewards can all be hovered over to get the name of them (titles and buffs names pull from the lubs, the item can be right clicked to show its description). Src-side, all achievements are stored in a .conf that allows you to specify a bunch of conditions as well as rewards. I made it quite flexible for rewards, allowing for items to be given in bunches rather than singles, and buffs are defined by SC constants, with var1~4 and tick all being modifiable. The title window is quite simple, and, again, is done with two packets. Really simple and easy. Of note, since the name packet had to be updated to allow for the displaying of titles, you can also give titles to mobs and NPCs as well! Finally, and easiest of all three, is random options. All client-side work was done for me, so I just needed to fill out the item data and save it somewhere. These, too, I've saved in a .conf that would allow for much more complex bonuses than the little bar could fit in. What's most exciting about random options is the fact you only really have to make one item for each slot and weapon type, and then you could easily let people just farm away for the best combination of options; it would cut down on a lot of bloat in the item DB. There you have it! Any questions I'd be happy to answer!
    1 point
  3. That is some OUTRAGEOUSLY hot pink there, dude. The map itself is fine but I would by lying if I said the ambient lighting you set doesn't physically hurt my eyes. Besides that, I would suggest using different wall textures: The ones you currently have picked out do not mesh very well with the much higher-res and darker floor textures you use.
    1 point
  4. yea i think there's no way, add it manually by copy pasting as you've said.
    1 point
  5. Use Thor patcher if you want to add more buttons.
    1 point
  6. Follow this guide on adding custom items. https://rathena.org/wiki/Custom_Items
    1 point
  7. For Old FCP. you need just need to revert it to its old effect. Just search for the older revision of rA.
    1 point
  8. Try iteminfo.lua not .lub. Change it while diffing your client.
    1 point
  9. at conf/char_athena.conf, change the server_name // Server name, use alternative character such as ASCII 160 for spaces. // NOTE: Do not use spaces or any of these characters which are not allowed in // Windows filenames \/:*?"<>| // ... or else guild emblems won't work client-side! server_name: Your_Server_Name
    1 point
  10. It'll be good... or not. Only if I can open markdown file in 'pretty view' locally (except Chrome extension). TL;TR Mark down file will be pretty good of Github integration, but not for local usage, but still I want to see the docs are human-readable. Well, just make README.md on /doc/, wite summary there, HIRE SOMEONE AS DOC MANAGER then whip them to make .md version of all rAthena docs, put the links on /doc/README.md, uploa dthe .md docs on different repo :v
    1 point
  11. Here's the answer: https://rathena.org/board/topic/88093-sonic-blow-unlimited/
    1 point
  12. iRO has the clan system active since some months, and players can apply to a clan. Here are some observations: When you pass the mouse over the clan master npc, it shows the clan logo in his name: This are the buffs seted when player joins the clan: StateIconList[EFST_IDs.EFST_SWORDCLAN] = { descript = { { "Sword clan", COLOR_TITLE_BUFF }, { "STR + 1, VIT + 1" }, { "MHP + 30, MSP + 10" } } } StateIconList[EFST_IDs.EFST_ARCWANDCLAN] = { descript = { { "Arcwand Clan", COLOR_TITLE_BUFF }, { "INT + 1, DEX + 1" }, { "MHP + 30, MSP + 10" } } } StateIconList[EFST_IDs.EFST_GOLDENMACECLAN] = { descript = { { "Goldenmace Clan", COLOR_TITLE_BUFF }, { "LUK + 1, INT + 1" }, { "MHP + 30, MSP + 10" } } } StateIconList[EFST_IDs.EFST_CROSSBOWCLAN] = { descript = { { "Crossbow Clan", COLOR_TITLE_BUFF }, { "DEX + 1, AGI + 1" }, { "MHP + 30, MSP + 10" } } } And this are the dialogues and messages from that four npcs: prt_in,33,114,5 script Raffam Oranpere 10058,{ mes "[Raffam Oranpere]"; mes "Hi! I'm Raffam, master of ^3131FFSword Clan^000000, one the Rune-Midgarts Kingdom."; next; switch(select("Introducing Clan", "Join.", "Leave.")){ case 1: switch(select("Clans are", "About the Sword Clan", "Cancel.")){ case 1: mes "[Raffam Oranpere]"; mes "The Clans are a type of guild ran by the Kingdom."; mes "They don't participate in the Siege, so members are free to join/leave anytime."; next; mes "[Raffam Oranpere]"; mes "I wish we could join the Siege. I'd love flying over on my dragon and burning everyone in my way!"; mes "Oops, too thrilled!"; next; mes "[Raffam Oranpere]"; mes "Join us, if no clan suits your taste."; mes "New members are given ^3131FFfree stat bonus^000000."; next; mes "[Raffam Oranpere]"; mes "Melee stats are offered as the name ^3131FFSword Clan^000000 suggests, but not all members are Melee classes."; mes "Don't feel pressured, just count on me!"; next; mes "[Raffam Oranpere]"; mes "Difference in variety creates the fun"; mes "These odd bunches never bore me in the party."; next; mes "[Raffam Oranpere]"; mes "And who knows you'll meet your soul mate in the clan? Hahah!"; close; case 2: mes "[Raffam Oranpere]"; mes "The ^3131FFSword Clan^000000 mainly supports Melee adventurers."; mes "Join for free ^FF0000<STR+1, VIT+1, MHP+30, MSP+10>^000000!"; next; mes "[Raffam Oranpere]"; mes "Remember, no Siege participation."; mes "You should contact other guilds for Siege."; next; mes "[Raffam Oranpere]"; mes "A question?"; mes "Excited to join me? Hahah!"; close; case 3: close; } case 2: mes "[Raffam Oranpere]"; mes "Oh, you'll join? Good choice!"; mes "Let's check the Clan policy then take admission procedures."; next; mes "[Raffam Oranpere]"; mes "^3131FFClansmen^000000 cannot participate in the Siege."; mes "New members are given these stat bonuses: ^FF0000<STR+1, VIT+1, MHP+30, MSP+10>^000000."; mes "You with me so far?"; next; if (select("Yes.", "No.") == 2){ mes "[Raffam Oranpere]"; mes "Uh, oh. Let's go back to"; mes "beginning."; close; } mes "[Raffam Oranpere]"; mes "Join and leave the clans anytime, but if you don't show up at clan for ^FF0000longer than 2 weeks^000000, you'll be ^FF0000expelled^000000."; mes "Clan masters exist for reason, like I."; mes "Understood?"; next; if (select("Yes.", "No.") == 2){ mes "[Raffam Oranpere]"; mes "Uh, oh. Let's go back to"; mes "beginning."; close; } mes "[Raffam Oranpere]"; mes "Great, sign name here on the register."; next; input .@input$; mes "[Raffam Oranpere]"; mes "So, you're ^3131FF" + strcharinfo(0) + "^000000! Nice name!"; mes "Let me register you."; next; if (getcharid(2)){ mes "[Raffam Oranpere]"; mes "Come back to join after you leave the current guild."; close; //} else if (clan()){ mes "[Raffam Oranpere]"; mes "Eh?"; mes "Oh, you're in Clan."; mes "Don't mess with me, it's not cool."; close; } mes "[Raffam Oranpere]"; mes "Welcome to ^3131FFSword Clan^000000!"; mes "You can review Clan info with ^3131FFCtrl+G^000000."; mes "At your service!"; // added to Sword Clan close; case 3: mes "[Raffam Oranpere]"; mes "You want to leave?"; mes "No problem. I hope you'll find more suitable clan."; mes "Ready for withdrawal?"; next; if (select("Continue.", "Cancel.") == 1){ /* if (clan() == Sword_Clan){ mes "[Raffam Oranpere]"; mes "Okay, it's done. But let's not be strangers, okay?"; mes "It was nice having you!"; // removed from Sword Clan } else if (clan()){ mes "[Raffam Oranpere]"; mes "Hey, talk to your guild master if you want to leave."; } else { mes "[Raffam Oranpere]"; mes "Wait, you're not with us! Grr, don't make me breathe fire at you!"; } */ } close; } } prt_in,35,114,5 script Devon Aire 10059,{ mes "[Devon Aire]"; mes "I'm Devon, master of ^3131FFArc Wand Clan^000000."; next; switch(select("Introducing Clan", "Join.", "Leave.")){ case 1: switch(select("Clans are", "About the Arc Wand Clan", "Cancel.")){ case 1: mes "[Devon Aire]"; mes "The ^3131FFClans^000000 are ran by the Kingdom, not privately like others."; mes "And I manage one of them."; next; mes "[Devon Aire]"; mes "..."; mes "What's with that look? You got a problem?"; next; mes "[Berman Aire]"; mes "Brother, you're scaring the potential member, be gentle."; next; mes "[Devon Aire]"; mes "..."; next; mes "[Devon Aire]"; mes "Join if seeking a place to fit in."; mes "We give ^3131FFfree bonus stat^000000. But no Siege."; next; mes "[Devon Aire]"; mes "Most members are offensive mage classes as the name ^3131FFArc Wand Clan^000000 suggests, but that's no requirement."; next; mes "[Devon Aire]"; mes "...Hey, Shaam Rumi."; mes "Stop hitting on my brother, and go work."; next; mes "[Shaam Rumi]"; mes "Whatever!"; next; mes "[Devon Aire]"; mes "...Hmpf!"; mes "Listen, Crossbow Clan's master is an evil."; next; mes "[Shaam Rumi]"; mes "Get over me, Decon! Don't spread rumors!"; // Note. Here literally says "Decon", but it may be "Devon" (typo mistake) next; mes "[Berman Aire]"; mes "Haha. stop it. You two are making a scene."; mes "Come on, back to work, guys."; close; case 2: mes "[Devon Aire]"; mes "The ^3131FFArc Wand Clan^000000 mainly supports offensive mage classes."; mes "We offer ^FF0000<INT+1, DEX+1, MHP+30, MSP+10>^000000 to new members. Don't ask for more; it's the Kingdom's rule."; next; mes "[Devon Aire]"; mes "^3131FFClansmen^000000 can't participate in the Siege."; mes "If you like the Siege, then go join a regular guild."; next; mes "[Devon Aire]"; mes "That is all. No questions."; close; case 3: close; } case 2: mes "[Devon Aire]"; mes "..."; mes "Let's check the Clan policy then take admission procedures."; next; mes "[Devon Aire]"; mes "^3131FFClansmen^000000 cannot participate in the Siege."; mes "New members are given these stat bonuses: ^FF0000<INT+1, DEX+1, MHP+30, MSP+10>^000000."; mes "You with me so far?"; next; if (select("Yes.", "No.") == 2){ mes "[Devon Aire]"; mes "Gosh, listen to the policy again."; close; } mes "[Devon Aire]"; mes "Join and leave the clans anytime, but if you don't show up at clan for ^FF0000more than 2 weeks^000000, you'll be ^FF0000expelled^000000."; mes "Do you agree?"; next; if (select("Yes.", "No.") == 2){ mes "[Devon Aire]"; mes "Then I don't want you."; close; } mes "[Devon Aire]"; mes "Sign your name here."; next; input .@input$; mes "[Devon Aire]"; mes "^3131FF" + strcharinfo(0) + "^000000...."; mes "Good, let me invite you in."; next; if (getcharid(2)){ mes "[Devon Aire]"; mes "Leave your guild first to join mine, duh."; close; //} else if (clan()){ mes "[Devon Aire]"; mes "You're already in a clan. You joking?!"; mes "Oh, I can be funny, too--FIRE PILLAR!"; close; } mes "[Devon Aire]"; mes "You have joined the ^3131FFArc Wand Clan^000000."; // added to Arc Wand Clan next; mes "[Devon Aire]"; mes "You can review Clan info with ^3131FFCtrl+G^000000."; mes "So don't bother me later."; next; mes "[Devon Aire]"; mes "That's all. Visit often or be expelled. Dismissed."; close; case 3: mes "[Devon Aire]"; mes "Want to leave, huh?"; mes "I understand it it's about Siege."; mes "If not, why are...Never mind.."; mes "I'll process your withdrawal."; next; if (select("Continue.", "Cancel.") == 1){ /* if (clan() == Arc_Wand_Clan){ mes "[Devon Aire]"; mes "You are withdrawn from the clan."; mes "Now leave. I don't feel like talking anymore."; // removed from Arc Wand Clan } else if (clan()){ mes "[Devon Aire]"; mes "You're barking up the wrong tree."; mes "Go to your clan master."; } else { mes "[Devon Aire]"; mes "Naughty children deserve a good Jupitel Thunder."; } */ } close; } } prt_in,37,114,5 script Berman Aire 10060,{ mes "[Berman Aire]"; mes "Nice to meet you. I'm Berman Aire, master of ^3131FFGoldenmace Clan^000000."; mes "I'm also the older brother of Devon Aire here. Devon looks tough, but he's a sweetheart."; next; switch(select("Introducing Clan", "Join.", "Leave.")){ case 1: switch(select("Clans are", "About the Golden Mace Clan", "Cancel.")){ case 1: mes "[Berman Aire]"; mes "The ^3131FFClans^000000 are established by the Kingdom to help adventurers connect and share information."; next; mes "[Berman Aire]"; mes "Because the Kingdom runs the clan, no Sieges, but at least the members are given ^3131FFstat bonuses^000000."; mes "The stat bonuses are small, but can be very useful for beginning adventurers."; next; mes "[Berman Aire]"; mes "We're named the ^3131FFGolden Mace Clan^000000, but we don't discriminate against applicants based on their classes."; mes "The name is just to help you easily choose your clan."; next; mes "[Shaam Rumi]"; mes "Berman, enough with the explanation. Let's go hang out in Glast Heim."; next; mes "[Devon Aire]"; mes "... Hey."; next; mes "[Shaam Rumi]"; mes "Ooh, you're scaring me."; mes "Berman, call me when you can!~"; next; mes "[Berman Aire]"; mes "Hah hah, I apologize for their bickering."; next; mes "[Berman Aire]"; mes "Do you have a question?"; mes "If you're tired of traveling alone, join us! You can join and leave the Clans anytime you want."; close; case 2: mes "[Berman Aire]"; mes "The ^3131FFGolden Mace Clan^000000 mainly supports supportive classes."; mes "We offer ^FF0000<INT+1, LUK+1, MHP+30, MSP+10>^000000 to new members."; next; mes "[Berman Aire]"; mes "As I told you earlier, Clans cannot join the Siege because they already belong to the Kingdom."; mes "If you want to be in the Siege, then I recommend you join a regular guild."; next; mes "[Berman Aire]"; mes "Do you understand about the Clans now?"; close; case 3: close; } case 2: mes "[Berman Aire]"; mes "Great!"; mes "Let's check the Clan policy then take admission procedures."; next; mes "[Berman Aire]"; mes "^3131FFClansmen^000000 cannot participate in the Siege."; mes "As our new member, you'll receive the following stat bonuses: ^FF0000<DEX+1, AGI+1, MHP+30, MSP+10>^000000."; mes "Do you agree?"; next; if (select("Yes.", "No.") == 2){ mes "[Berman Aire]"; mes "I suggest you to think it over."; close; } mes "[Berman Aire]"; mes "Join and leave the clans anytime, but if you don't show up at clan for ^FF0000more than 2 weeks^000000, you'll be ^FF0000expelled^000000."; mes "Do you agree to maintain good standing in Clan?"; next; if (select("Yes.", "No.") == 2){ mes "[Berman Aire]"; mes "I'm sure you'll find a clan better suited for your needs."; close; } mes "[Berman Aire]"; mes "Now, please write your name here."; next; input .@input$; mes "[Berman Aire]"; mes "^3131FF" + strcharinfo(0) + "^000000! What a good name!"; mes "Okay, then..."; next; if (getcharid(2)){ mes "[Berman Aire]"; mes "Oh, no."; mes "In order to join, you first have to leave the current guild."; close; //} else if (clan()){ mes "[Berman Aire]"; mes "You're already in a clan."; mes "You're just confused, right?"; close; } mes "[Berman Aire]"; mes "Welcome to the ^3131FFGolden Mace Clan^000000!"; // added to Golden Mace Clan next; mes "[Berman Aire]"; mes "You can review Clan info with ^3131FFCtrl+G^000000."; next; mes "[Berman Aire]"; mes "Please remember the few precautions I gave you, and enjoy your Clan activities!"; close; case 3: mes "[Berman Aire]"; mes "With meeting, there is parting."; mes "I hope you enjoyed your time in ^3131FFGolden Mace Clan^000000."; mes "Now, should I process your withdrawal?"; next; if (select("Continue.", "Cancel.") == 1){ /* if (clan() == Goldenmace_Clan){ mes "[Berman Aire]"; mes "It's processed."; mes "Come back anytime to ^3131FFGolden Mace Clan^000000. I'll be here."; // removed from Golden Mace Clan } else if (clan()){ mes "[Berman Aire]"; mes "I'm sorry, but I can't remove you from another clan.."; } else { mes "[Berman Aire]"; mes "You can't leave the clan without joining it first."; } */ } close; } } prt_in,39,114,5 script Shaam Rumi 10061,{ mes "[Shaam Rumi]"; mes "Hi, there! I'm Shaam, master of ^3131FFCrossbow Clan^000000"; mes "What can I do for you?"; next; switch(select("Introducing Clan", "Join.", "Leave.")){ case 1: switch(select("Clans are", "About the Crossbow Clan", "Cancel.")){ case 1: mes "[Shaam Rumi]"; mes "The Clan established by the Rune-Midgarts Kingdom to... Raffam, why are our ^3131FFclans^000000 made?"; next; mes "[Raffam Oranpere]"; mes "Did you sleep in class? Gosh."; mes "The Clans help lone adventurers connect with each other and share information."; next; mes "[Shaam Rumi]"; mes "A-ha, got it! Thank you, Captain!"; mes "You heard that too, right?"; next; mes "[Shaam Rumi]"; mes "Run by the Kingdom itself, the Clans are not allowed to participate in the Siege, but the good news is that the members are given some ^3131FFstat bonuses^000000."; next; mes "[Shaam Rumi]"; mes "In case you wonder if the ^3131FFCrossbow Clan^000000 only recruits Archers, no, it doesn't."; mes "All the Clans accept all classes."; mes "You can choose the one that suits your needs best."; next; mes "[Shaam Rumi]"; mes "That should cover everything there is to know."; mes "Berman, let's go hang out in Glast Heim."; next; mes "[Devon Aire]"; mes "You..."; next; mes "[Shaam Rumi]"; mes "Ooh, scary! You're so protective of your brother."; close; case 2: mes "[Shaam Rumi]"; mes "The ^3131FFCrossbow Clan^000000 is ideal for Ranged classes."; next; mes "[Shaam Rumi]"; mes "Eh, let me check the Clan manual."; mes "Ah, and we offer stat bonuses to new members: ^FF0000<DEX+1, AGI+1, MHP+30, MSP+10>^000000."; next; mes "[Shaam Rumi]"; mes "The Clans are not allowed to participate in the Siege; you should join a private guild instead for the Siege."; mes "The Clans are for adventurers that hate being tied down."; next; mes "[Shaam Rumi]"; mes "Do you have a question?"; close; case 3: close; } case 2: mes "[Shaam Rumi]"; mes "Oh, yeah? Good choice!"; mes "Let's check the Clan policy then take admission procedures."; next; mes "[Shaam Rumi]"; mes "^3131FFClansmen^000000 cannot participate in the Siege."; mes "As our new member, you'll receive the following stat bonuses: ^FF0000<DEX+1, AGI+1, MHP+30, MSP+10>^000000."; mes "Do you agree?"; next; if (select("Yes.", "No.") == 2){ mes "[Shaam Rumi]"; mes "Ah, do you need time to think about this? No problem."; close; } mes "[Shaam Rumi]"; mes "Join and leave the clans anytime, but if you don't show up at clan for ^FF0000more than 2 weeks^000000, you'll be ^FF0000expelled^000000."; mes "Do you promise you'll maintain good standing?"; next; if (select("Yes.", "No.") == 2){ mes "[Shaam Rumi]"; mes "All right then. I'm just going to go have some fun."; close; } mes "[Shaam Rumi]"; mes "Good, write your name here."; next; input .@input$; mes "[Shaam Rumi]"; mes "^3131FF" + strcharinfo(0) + "^000000..!"; mes "Ugh, your penmanship needs work."; mes "Let me process your application."; next; if (getcharid(2)){ mes "[Shaam Rumi]"; mes "Did you finish things up with your old clan?"; close; //} else if (clan()){ mes "[Shaam Rumi]"; mes "Eh, you're already in a clan. Hey, this isn't funny."; close; } mes "[Shaam Rumi]"; mes "Welcome to the ^3131FFCrossbow Clan^000000!"; // added to Crossbow clan next; mes "[Shaam Rumi]"; mes "You can review Clan info with ^3131FFCtrl+G^000000."; next; mes "[Shaam Rumi]"; mes "Don't pick fights with other clansmen. Be social."; mes "If you need help, you can always whisper me, okay? See you around!"; close; case 3: mes "[Shaam Rumi]"; mes "Why, did you find a better clan?"; mes "I'm disappointed, but it's your call. Let me process your withdrawal."; next; if (select("Continue.", "Cancel.") == 1){ /* if (clan() == Crossbow_Clan){ mes "[Shaam Rumi]"; mes "It's done."; mes "If you ever miss us, don't hesitate to come back, all right?"; // removed from Crossbow Clan } else if (clan()){ mes "[Shaam Rumi]"; mes "Sorry, but I don't meddle with other clan's business."; } else { mes "[Shaam Rumi]"; mes "I can't let you leave--you're not even in my clan!"; } */ } close; } } I used a "clan()" fictional command to indicate the kind of activity every npc do. I hope this help
    1 point
×
×
  • Create New...