浏览代码

git-svn-id: https://svn.code.sf.net/p/rathena/svn/athena@331 54d463be-8e91-2dee-dedb-b68131a5f0ec

mc_cameri 20 年之前
父节点
当前提交
974c37433b
共有 11 个文件被更改,包括 656 次插入317 次删除
  1. 4 0
      Changelog.txt
  2. 12 35
      conf-tmpl/GM_account.txt
  3. 2 2
      conf-tmpl/charcommand_athena.conf
  4. 1 246
      conf-tmpl/msg_athena.conf
  5. 552 0
      doc/miscnotes.txt
  6. 2 0
      src/common/mmo.h
  7. 59 30
      src/login/login.c
  8. 17 0
      src/map/atcommand.c
  9. 1 0
      src/map/atcommand.h
  10. 1 0
      src/map/charcommand.c
  11. 5 4
      src/map/script.c

+ 4 - 0
Changelog.txt

@@ -1,5 +1,9 @@
 Date	Added
 11/22
+	* (TXT)Stripped some code off read_gm_accounts() and made with it addGM() [MC Cameri]
+	  -Usage: addGM(account_id,level);
+	* (TXT)Changed GM_accounts.txt to meet new standards. [MC Cameri]
+	* (TXT)Enabled the use of id ranges in GM_accounts.txt [MC Cameri]
 	* Added a few free()'s so that I am sure it freed the allocated memory (char & login) [Codemaster]
 	* Changed monsters_ignore_gm option to a level value. [Valaris]
 	  (accounts greater than or equal to this setting won't be attacked by aggressives.)

+ 12 - 35
conf-tmpl/GM_account.txt

@@ -1,35 +1,12 @@
-// GMとして認識するアカウントIDを設定
-// <account ID> <level>
-// <GMのアカウントID> <GMのレベル>
-// GMのレベルは0以下は無視で最大は99
-704554 99
-704555 1
-704556 1
-704557 1
-704558 1
-704559 1
-704560 1
-704561 1
-704562 1
-704563 1
-704564 1
-704565 1
-704566 1
-704567 1
-704568 1
-704569 1
-704570 1
-704571 1
-704572 1
-704573 1
-704574 1
-704575 1
-704576 1
-704577 1
-704578 1
-704579 1
-704580 1
-704581 1
-704582 1
-704583 1
-794584 1
+// eAthena's GM Accounts File
+// Edited by MC Cameri to enable account id ranges
+// Changing this file while login server is running 
+// Usage #1(Standard): <account id> <level>
+// Usage #2(Range): <beginning of range[-:~]end of range> <level>
+// Examples:
+// 2000002 99
+// 2000003-2000005 99
+// 2000003~2000005 99
+// 704585 30
+
+704554-704584 99

+ 2 - 2
conf-tmpl/charcommand_athena.conf

@@ -1,10 +1,10 @@
 // Athena charcommand Configuration file.
-// Translated by Peter Kieser <pfak@telus.net>
+// Created by MC Cameri for eAthena
 
 // Set here the symbol that you want to use for your commands
 // Only 1 character is get (default is '#'). You can set any character,
 // except control-character (0x00-0x1f), '%' (party chat speaking) and '/' (standard ragnarok GM commands)
-// With default character, all commands begin by a '#': <example> #revive
+// With default character, all commands begin by a '#', example: #revive
 command_symbol: #
 
 job: 60

+ 1 - 246
conf-tmpl/msg_athena.conf

@@ -11,487 +11,246 @@
 // Messages of GM commands
 // -----------------------
 
-//0: Warped.
 0: Warped.
-//1: Map not found.
 1: Map not found.
-//2: Coordinates out of range.
 2: Coordinates out of range.
-//3: Character not found.
 3: Character not found.
-//4: Jump to %s
 4: Jump to %s
-//5: Jump to %d %d
 5: Jump to %d %d
-//6: Character data respawn point saved.
 6: Character data respawn point saved.
-//7: Warping to respawn point.
 7: Warping to respawn point.
-//8: Speed changed.
 8: Speed changed.
-//9: Options changed.
 9: Options changed.
-//10: Invisible: Off
 10: Invisible: Off
-//11: Invisible: On
 11: Invisible: On
-//12: Your job has been changed.
 12: Your job has been changed.
-//13: A pity! You've died.
 13: A pity! You've died.
-//14: Character killed.
 14: Character killed.
-//15: Player warped (message sends to player too).
 15: Player warped (message sends to player too).
-//16: You've been revived! It's a miracle!
 16: You've been revived! It's a miracle!
-//17: HP, SP recovered.
 17: HP, SP recovered.
-//18: Item created.
 18: Item created.
-//19: Invalid item ID or name.
 19: Invalid item ID or name.
-//20: All of your items have been removed.
 20: All of your items have been removed.
-//21: Base level raised.
 21: Base level raised.
-//22: Base level lowered.
 22: Base level lowered.
-//23: Job level can't go any higher.
 23: Job level can't go any higher.
-//24: Job level raised.
 24: Job level raised.
-//25: Job level lowered.
 25: Job level lowered.
-//26: Help commands:
 26: Help commands:
-//27: File help.txt not found.
 27: File help.txt not found.
-//28: No player found.
 28: No player found.
-//29: 1 player found.
 29: 1 player found.
-//30: %d players found.
 30: %d players found.
-//31: PvP: Off.
 31: PvP: Off.
-//32: PvP: On.
 32: PvP: On.
-//33: GvG: Off.
 33: GvG: Off.
-//34: GvG: On.
 34: GvG: On.
-//35: You can't use this command with this class.
 35: You can't use this command with this class.
-//36: Appearence changed.
 36: Appearence changed.
-//37: An invalid number was specified.
 37: An invalid number was specified.
-//38: Invalid location number or name.
 38: Invalid location number or name.
-//39: All monster summoned!
 39: All monster summoned!
-//40: Invalid monster ID or name.
 40: Invalid monster ID or name.
-//41: Impossible to decrease the number/value.
 41: Impossible to decrease the number/value.
-//42: Stat changed.
 42: Stat changed.
-//43: You're not in a guild.
 43: You're not in a guild.
-//44: You're not the master of your guild.
 44: You're not the master of your guild.
-//45: Guild level change failed.
 45: Guild level change failed.
-//46: %s recalled!
 46: %s recalled!
-//47: Base level can't go any higher.
 47: Base level can't go any higher.
-//48: Character's job changed.
 48: Character's job changed.
-//49: Invalid job ID.
 49: Invalid job ID.
-//50: You already have some GM powers.
 50: You already have some GM powers.
-//51: Character revived.
 51: Character revived.
-//52: This option cannot be used in PK Mode.
 52: This option cannot be used in PK Mode.
-//53: '%s' stats:
 53: '%s' stats:
-//54: No player found in map '%s'.
 54: No player found in map '%s'.
-//55: 1 player found in map '%s'.
 55: 1 player found in map '%s'.
-//56: %d players found in map '%s'.
 56: %d players found in map '%s'.
-//57: Character's respawn point changed.
 57: Character's respawn point changed.
-//58: Character's options changed.
 58: Character's options changed.
-//59: Night has fallen.
 59: Night has fallen.
-//60: Day has arrived.
 60: Day has arrived.
-//61: The holy messenger has given judgement.
 61: The holy messenger has given judgement.
-//62: Judgement was made.
 62: Judgement was made.
-//63: Mercy has been shown.
 63: Mercy has been shown.
-//64: Mercy has been granted.
 64: Mercy has been granted.
-//65: Character's base level raised.
 65: Character's base level raised.
-//66: Character's base level lowered.
 66: Character's base level lowered.
-//67: Character's job level can't go any higher.
 67: Character's job level can't go any higher.
-//68: character's job level raised.
 68: character's job level raised.
-//69: Character's job level lowered.
 69: Character's job level lowered.
-//70: You have learned the skill.
 70: You have learned the skill.
-//71: You have forgotten the skill.
 71: You have forgotten the skill.
-//72: Guild siege warfare start!
 72: Guild siege warfare start!
-//73: Already it has started siege warfare.
 73: Already it has started siege warfare.
-//74: Guild siege warfare end!
 74: Guild siege warfare end!
-//75: Siege warfare hasn't started yet.
 75: Siege warfare hasn't started yet.
-//76: You have received all skills.
 76: You have received all skills.
-//77: The reference result of '%s' (name: id):
 77: The reference result of '%s' (name: id):
-//78: %s: %d
 78: %s: %d
-//79: It is %d affair above.
 79: It is %d affair above.
-//80: Give a display name and monster name/id please.
 80: Give a display name and monster name/id please.
-//81: Your GM level don't authorise you to do this action on this player.
 81: Your GM level don't authorise you to do this action on this player.
-//82: Please, use one of this number/name:
 82: Please, use one of this number/name:
-//83: Cannot spawn emperium.
 83: Cannot spawn emperium.
-//84: All stats changed!
 84: All stats changed!
-//85: Invalid time for ban command.
 85: Invalid time for ban command.
-//86: Sorry, but a player name have at least 4 characters.
 86: Sorry, but a player name have at least 4 characters.
-//87: Sorry, but a player name have 23 characters maximum.
 87: Sorry, but a player name have 23 characters maximum.
-//88: Character name sends to char-server to ask it.
 88: Character name sends to char-server to ask it.
-//89: Sorry, it's already the night. Impossible to execute the command.
 89: Sorry, it's already the night. Impossible to execute the command.
-//90: Sorry, it's already the day. Impossible to execute the command.
 90: Sorry, it's already the day. Impossible to execute the command.
-//91: Character's base level can't go any higher.
 91: Character's base level can't go any higher.
-//92: All characters recalled!
 92: All characters recalled!
-//93: All online characters of the %s guild are near you.
 93: All online characters of the %s guild are near you.
-//94: Incorrect name/ID, or no one from the guild is online.
 94: Incorrect name/ID, or no one from the guild is online.
-//95: All online characters of the %s party are near you.
 95: All online characters of the %s party are near you.
-//96: Incorrect name or ID, or no one from the party is online.
 96: Incorrect name or ID, or no one from the party is online.
-//97: Item database reloaded.
 97: Item database reloaded.
-//98: Monster database reloaded.
 98: Monster database reloaded.
-//99: Skill database reloaded.
 99: Skill database reloaded.
-//100: Scripts reloaded.
 100: Scripts reloaded.
-//101: Login-server asked to reload GM accounts and their level.
 101: Login-server asked to reload GM accounts and their level.
-//102: Mounted Peco.
 102: Mounted Peco.
-//103: No longer spying on the %s guild.
 103: No longer spying on the %s guild.
-//104: Spying on the %s guild.
 104: Spying on the %s guild.
-//105: No longer spying on the %s party.
 105: No longer spying on the %s party.
-//106: Spying on the %s party.
 106: Spying on the %s party.
-//107: All items have been repaired.
 107: All items have been repaired.
-//108: No item need to be repaired.
 108: No item need to be repaired.
-//109: Player has been nuked!
 109: Player has been nuked!
-//110: Npc Enabled.
 110: Npc Enabled.
-//111: This NPC doesn't exist.
 111: This NPC doesn't exist.
-//112: Npc Disabled.
 112: Npc Disabled.
-//113: %d item(s) removed by a GM.
 113: %d item(s) removed by a GM.
-//114: %d item(s) removed from the player.
 114: %d item(s) removed from the player.
-//115: %d item(s) removed. Player had only %d on %d items.
 115: %d item(s) removed. Player had only %d on %d items.
-//116: Character does not have the item.
 116: Character does not have the item.
-//117: GM has send you in jails.
 117: GM has send you in jails.
-//118: Player warped in jails.
 118: Player warped in jails.
-//119: This player is not in jails.
 119: This player is not in jails.
-//120: GM has discharge you.
 120: GM has discharge you.
-//121: Player warped to Prontera.
 121: Player warped to Prontera.
-//122: Disguise applied.
 122: Disguise applied.
-//123: Monster/NPC name/id hasn't been found.
 123: Monster/NPC name/id hasn't been found.
-//124: Undisguise applied.
 124: Undisguise applied.
-//125: You're not disguised.
 125: You're not disguised.
-//126: You accept any wisp (no wisper is refused).
 126: You accept any wisp (no wisper is refused).
-//127: You accept any wisp, except thoses from %d player(s):
 127: You accept any wisp, except thoses from %d player(s):
-//128: You refuse all wisps (no specifical wisper is refused).
 128: You refuse all wisps (no specifical wisper is refused).
-//129: You refuse all wisps, AND refuse wisps from %d player(s):
 129: You refuse all wisps, AND refuse wisps from %d player(s):
-//130: '%s' accept any wisp (no wisper is refused).
 130: '%s' accept any wisp (no wisper is refused).
-//131: '%s' accept any wisp, except thoses from %d player(s):
 131: '%s' accept any wisp, except thoses from %d player(s):
-//132: '%s' refuse all wisps (no specifical wisper is refused).
 132: '%s' refuse all wisps (no specifical wisper is refused).
-//133: '%s' refuse all wisps, AND refuse wisps from %d player(s):
 133: '%s' refuse all wisps, AND refuse wisps from %d player(s):
-//134: '%s' already accepts all wispers.
 134: '%s' already accepts all wispers.
-//135: '%s' now accepts all wispers.
 135: '%s' now accepts all wispers.
-//136: A GM has authorised all wispers for you.
 136: A GM has authorised all wispers for you.
-//137: '%s' already blocks all wispers.
 137: '%s' already blocks all wispers.
-//138: '%s' blocks now all wispers.
 138: '%s' blocks now all wispers.
-//139: A GM has blocked all wispers for you.
 139: A GM has blocked all wispers for you.
-//140: Character's disguise applied.
 140: Character's disguise applied.
-//141: Character's undisguise applied.
 141: Character's undisguise applied.
-//142: Character is not disguised.
 142: Character is not disguised.
-//143: Give a monster name/id please.
 143: Give a monster name/id please.
-//144: Invalid actual email. If you have default e-mail, type a@a.com.
 144: Invalid actual email. If you have default e-mail, type a@a.com.
-//145: Invalid new email. Please enter a real e-mail.
 145: Invalid new email. Please enter a real e-mail.
-//146: New email must be a real e-mail.
 146: New email must be a real e-mail.
-//147: New email must be different of the actual e-mail.
 147: New email must be different of the actual e-mail.
-//148: Information sended to login-server via char-server.
 148: Information sended to login-server via char-server.
-//149: Impossible to increase the number/value.
 149: Impossible to increase the number/value.
-//150: No GM found.
 150: No GM found.
-//151: 1 GM found.
 151: 1 GM found.
-//152: %d GMs found.
 152: %d GMs found.
-//153: %s is Unknown Command.
 153: %s is Unknown Command.
-//154: %s failed.
 154: %s failed.
-//155: Impossible to change your job.
 155: Impossible to change your job.
-//156: HP or/and SP modified.
 156: HP or/and SP modified.
-//157: HP and SP are already with the good value.
 157: HP and SP are already with the good value.
-//158: Base level can't go any lower.
 158: Base level can't go any lower.
-//159: Job level can't go any lower.
 159: Job level can't go any lower.
-//160: PvP is already Off.
 160: PvP is already Off.
-//161: PvP is already On.
 161: PvP is already On.
-//162: GvG is already Off.
 162: GvG is already Off.
-//163: GvG is already On.
 163: GvG is already On.
-//164: Your memo point #%d doesn't exist.
 164: Your memo point #%d doesn't exist.
-//165: All monsters killed!
 165: All monsters killed!
-//166: No item has been refined!
 166: No item has been refined!
-//167: 1 item has been refined!
 167: 1 item has been refined!
-//168: %d items have been refined!
 168: %d items have been refined!
-//169: This item (%d: '%s') is not an equipment.
 169: This item (%d: '%s') is not an equipment.
-//170: This item is not an equipment.
 170: This item is not an equipment.
-//171: %d - void
 171: %d - void
-//172: You replace previous memo position %d - %s (%d,%d).
 172: You replace previous memo position %d - %s (%d,%d).
-//173: Note: you don't have the 'Warp' skill level to use it.
 173: Note: you don't have the 'Warp' skill level to use it.
-//174: Number of status points changed!
 174: Number of status points changed!
-//175: Number of skill points changed!
 175: Number of skill points changed!
-//176: Number of zenys changed!
 176: Number of zenys changed!
-//177: Impossible to decrease a stat.
 177: Impossible to decrease a stat.
-//178: Impossible to increase a stat.
 178: Impossible to increase a stat.
-//179: Guild level changed.
 179: Guild level changed.
-//180: The monter/egg name/id doesn't exist.
 180: The monter/egg name/id doesn't exist.
-//181: You already have a pet.
 181: You already have a pet.
-//182: Pet friendly value changed!
 182: Pet friendly value changed!
-//183: Pet friendly is already the good value.
 183: Pet friendly is already the good value.
-//184: Sorry, but you have no pet.
 184: Sorry, but you have no pet.
-//185: Pet hungry value changed!
 185: Pet hungry value changed!
-//186: Pet hungry is already the good value.
 186: Pet hungry is already the good value.
-//187: You can now rename your pet.
 187: You can now rename your pet.
-//188: You can already rename your pet.
 188: You can already rename your pet.
-//189: This player can now rename his/her pet.
 189: This player can now rename his/her pet.
-//190: This player can already rename his/her pet.
 190: This player can already rename his/her pet.
-//191: Sorry, but this player has no pet.
 191: Sorry, but this player has no pet.
-//192: Impossible to change the character's job.
 192: Impossible to change the character's job.
-//193: Character's base level can't go any lower.
 193: Character's base level can't go any lower.
-//194: Character's job level can't go any lower.
 194: Character's job level can't go any lower.
-//195: All players have been kicked!
 195: All players have been kicked!
-//196: You already have this quest skill.
 196: You already have this quest skill.
-//197: This skill number doesn't exist or isn't a quest skill.
 197: This skill number doesn't exist or isn't a quest skill.
-//198: This skill number doesn't exist.
 198: This skill number doesn't exist.
-//199: This player has learned the skill.
 199: This player has learned the skill.
-//200: This player already has this quest skill.
 200: This player already has this quest skill.
-//201: You don't have this quest skill.
 201: You don't have this quest skill.
-//202: This player has forgotten the skill.
 202: This player has forgotten the skill.
-//203: This player doesn't have this quest skill.
 203: This player doesn't have this quest skill.
-//204: WARNING: more than 1000 spiritballs can CRASH your server and/or client!
 204: WARNING: more than 1000 spiritballs can CRASH your server and/or client!
-//205: You already have this number of spiritballs.
 205: You already have this number of spiritballs.
-//206: '%s' skill points reseted!
 206: '%s' skill points reseted!
-//207: '%s' stats points reseted!
 207: '%s' stats points reseted!
-//208: '%s' skill and stats points reseted!
 208: '%s' skill and stats points reseted!
-//209: Character's number of skill points changed!
 209: Character's number of skill points changed!
-//210: Character's number of status points changed!
 210: Character's number of status points changed!
-//211: Character's number of zenys changed!
 211: Character's number of zenys changed!
-//212: Cannot mount a Peco while in disguise.
 212: Cannot mount a Peco while in disguise.
-//213: You can not mount a peco with your job.
 213: You can not mount a peco with your job.
-//214: Unmounted Peco.
 214: Unmounted Peco.
-//215: This player cannot mount a Peco while in disguise.
 215: This player cannot mount a Peco while in disguise.
-//216: Now, this player mounts a peco.
 216: Now, this player mounts a peco.
-//217: This player can not mount a peco with his/her job.
 217: This player can not mount a peco with his/her job.
-//218: Now, this player has not more peco.
 218: Now, this player has not more peco.
-//219: %d day
 219: %d day
-//220: %d days
 220: %d days
-//221: %s %d hour
 221: %s %d hour
-//222: %s %d hours
 222: %s %d hours
-//223: %s %d minute
 223: %s %d minute
-//224: %s %d minutes
 224: %s %d minutes
-//225: %s and %d second
 225: %s and %d second
-//226: %s and %d seconds
 226: %s and %d seconds
-//227: Cannot wear disguise while riding a Peco.
 227: Cannot wear disguise while riding a Peco.
-//228: Character cannot wear disguise while riding a Peco.
 228: Character cannot wear disguise while riding a Peco.
-//229: Your Effect Has Changed.
 229: Your Effect Has Changed.
-//230: Server time (normal time): %A, %B %d %Y %X.
 230: Server time (normal time): %A, %B %d %Y %X.
-//231: Game time: The game is in permanent daylight.
 231: Game time: The game is in permanent daylight.
-//232: Game time: The game is in permanent night.
 232: Game time: The game is in permanent night.
-//233: Game time: The game is actualy in night for %s.
 233: Game time: The game is actualy in night for %s.
-//234: Game time: After, the game will be in permanent daylight.
 234: Game time: After, the game will be in permanent daylight.
-//235: Game time: The game is actualy in daylight for %s.
 235: Game time: The game is actualy in daylight for %s.
-//236: Game time: After, the game will be in permanent night.
 236: Game time: After, the game will be in permanent night.
-//237: Game time: After, the game will be in night for %s.
 237: Game time: After, the game will be in night for %s.
-//238: Game time: A day cycle has a normal duration of %s.
 238: Game time: A day cycle has a normal duration of %s.
-//239: Game time: After, the game will be in daylight for %s.
 239: Game time: After, the game will be in daylight for %s.
-//240: %d monster(s) summoned!
 240: %d monster(s) summoned!
 241: you be a killa..
 242: you gonna be own3d..
@@ -502,11 +261,7 @@
 // Messages of others (not for GM commands)
 // ----------------------------------------
 
-//500: Actually, it's the night...
 500: Actually, it's the night...
-//501: Your account time limit is: %d-%m-%Y %H:%M:%S.
 501: Your account time limit is: %d-%m-%Y %H:%M:%S.
-//502: The day has arrived!
 502: The day has arrived!
-//503: The night has fallen...
-503: The night has fallen...
+503: The night has fallen...

+ 552 - 0
doc/miscnotes.txt

@@ -0,0 +1,552 @@
+// ****************************************************
+// * Miscellaneous Notes (Added by MC Cameri)         *
+// ****************************************************
+
+// *****************************************************************
+// * Emotions that will be shown if 'int type' is one of the case. *
+// *****************************************************************
+void clif_emotion(struct block_list *bl,int type);
+case for 'int type':
+0 = !		10 = KO (Scissor)	20 = Hmmm	30 = Kiss 1 (R)		40 = Tsk tsk tsk (No)
+1 = ?		11 = Fist (Stone)	21 = Number 1!	31 = Kiss 2 (L)		41 = Petting
+2 = Music	12 = Hand (Paper)	22 = No (??)	32 = Smoking		42 = SP! (Timer)
+3 = Heart 1	13 = Korean Flag	23 = OMG!!	33 = Okay		43 = Obsessed 2 (Dumb face, eyes popping)
+4 = Sweat	14 = Heart 2		24 = O		34 = ... (Bugged)	44 = Come (Moving finger)
+5 = Light bulb	15 = Thanks		25 = X		35 = ??? Flag		45 = Yawn (Sleepy)
+6 = Annoyed	16 = Wah (Crying)	26 = Help!	36 = Evil 2		46 = Congratulations
+7 = Smoke cloud	17 = Sorry		27 = Go!	37 = Obsessed 1		47 = HP! (Timer)
+8 = $		18 = Heh (Laughing)	28 = Sobbing	38 = Two Hearts		
+9 = ...		19 = Sweating		29 = Evil 1	39 = Tongue		
+
+// ********************************
+// * Elemental Defense Resistance *
+// ********************************
+sd->subele[0] - Neutral Property
+sd->subele[1] - Water Property
+sd->subele[2] - Earth Property
+sd->subele[3] - Fire Property
+sd->subele[4] - Wind Property
+sd->subele[5] - Poison Property
+sd->subele[6] - Holy Property
+sd->subele[7] - Shadow Property
+sd->subele[8] - Ghost Property
+sd->subele[9] - Undead Property
+
+// ***************************************
+// * Elemental Monster Attack Resistance *
+// ***************************************
+
+sd->subrace[0] - Neutral Type
+sd->subrace[1] - Undead Type
+sd->subrace[2] - Brute Type
+sd->subrace[3] - Plant Type
+sd->subrace[4] - Insect Type
+sd->subrace[5] - Fish Type
+sd->subrace[6] - Demon Type
+sd->subrace[7] - Demi-Human Type
+sd->subrace[8] - Angel Type
+sd->subrace[9] - Dragon Type
+sd->subrace[10] - Boss Type #1?
+sd->subrace[11] - Boss Type #2?
+
+// **************
+// * Misc stuff *
+// **************
+
+WFIFOL(fd,2)=1; - Sever Closed
+
+// *******************
+// * Skills List     *
+// *******************
+// * ID	= Skill Name *
+// *******************
+ID	Skill Name
+1 =	NV_BASIC
+2 =	SM_SWORD
+3 =	SM_TWOHAND
+4 =	SM_RECOVERY
+5 =	SM_BASH
+6 =	SM_PROVOKE
+7 =	SM_MAGNUM
+8 =	SM_ENDURE
+9 =	MG_SRECOVERY
+10 =	MG_SIGHT
+11 =	MG_NAPALMBEAT
+12 =	MG_SAFETYWALL
+13 =	MG_SOULSTRIKE
+14 =	MG_COLDBOLT
+15 =	MG_FROSTDIVER
+16 =	MG_STONECURSE
+17 =	MG_FIREBALL
+18 =	MG_FIREWALL
+19 =	MG_FIREBOLT
+20 =	MG_LIGHTNINGBOLT
+21 =	MG_THUNDERSTORM
+22 =	AL_DP
+23 =	AL_DEMONBANE
+24 =	AL_RUWACH
+25 =	AL_PNEUMA
+26 =	AL_TELEPORT
+27 =	AL_WARP
+28 =	AL_HEAL
+29 =	AL_INCAGI
+30 =	AL_DECAGI
+31 =	AL_HOLYWATER
+32 =	AL_CRUCIS
+33 =	AL_ANGELUS
+34 =	AL_BLESSING
+35 =	AL_CURE
+36 =	MC_INCCARRY
+37 =	MC_DISCOUNT
+38 =	MC_OVERCHARGE
+39 =	MC_PUSHCART
+40 =	MC_IDENTIFY
+41 =	MC_VENDING
+42 =	MC_MAMMONITE
+43 =	AC_OWL
+44 =	AC_VULTURE
+45 =	AC_CONCENTRATION
+46 =	AC_DOUBLE
+47 =	AC_SHOWER
+48 =	TF_DOUBLE
+49 =	TF_MISS
+50 =	TF_STEAL
+51 =	TF_HIDING
+52 =	TF_POISON
+53 =	TF_DETOXIFY
+54 =	ALL_RESURRECTION
+55 =	KN_SPEARMASTERY
+56 =	KN_PIERCE
+57 =	KN_BRANDISHSPEAR
+58 =	KN_SPEARSTAB
+59 =	KN_SPEARBOOMERANG
+60 =	KN_TWOHANDQUICKEN
+61 =	KN_AUTOCOUNTER
+62 =	KN_BOWLINGBASH
+63 =	KN_RIDING
+64 =	KN_CAVALIERMASTERY
+65 =	PR_MACEMASTERY
+66 =	PR_IMPOSITIO
+67 =	PR_SUFFRAGIUM
+68 =	PR_ASPERSIO
+69 =	PR_BENEDICTIO
+70 =	PR_SANCTUARY
+71 =	PR_SLOWPOISON
+72 =	PR_STRECOVERY
+73 =	PR_KYRIE
+74 =	PR_MAGNIFICAT
+75 =	PR_GLORIA
+76 =	PR_LEXDIVINA
+77 =	PR_TURNUNDEAD
+78 =	PR_LEXAETERNA
+79 =	PR_MAGNUS
+80 =	WZ_FIREPILLAR
+81 =	WZ_SIGHTRASHER
+83 =	WZ_METEOR
+84 =	WZ_JUPITEL
+85 =	WZ_VERMILION
+86 =	WZ_WATERBALL
+87 =	WZ_ICEWALL
+88 =	WZ_FROSTNOVA
+89 =	WZ_STORMGUST
+90 =	WZ_EARTHSPIKE
+91 =	WZ_HEAVENDRIVE
+92 =	WZ_QUAGMIRE
+93 =	WZ_ESTIMATION
+94 =	BS_IRON
+95 =	BS_STEEL
+96 =	BS_ENCHANTEDSTONE
+97 =	BS_ORIDEOCON
+98 =	BS_DAGGER
+99 =	BS_SWORD
+100 =	BS_TWOHANDSWORD
+101 =	BS_AXE
+102 =	BS_MACE
+103 =	BS_KNUCKLE
+104 =	BS_SPEAR
+105 =	BS_HILTBINDING
+106 =	BS_FINDINGORE
+107 =	BS_WEAPONRESEARCH
+108 =	BS_REPAIRWEAPON
+109 =	BS_SKINTEMPER
+110 =	BS_HAMMERFALL
+111 =	BS_ADRENALINE
+112 =	BS_WEAPONPERFECT
+113 =	BS_OVERTHRUST
+114 =	BS_MAXIMIZE
+115 =	HT_SKIDTRAP
+116 =	HT_LANDMINE
+117 =	HT_ANKLESNARE
+118 =	HT_SHOCKWAVE
+119 =	HT_SANDMAN
+120 =	HT_FLASHER
+121 =	HT_FREEZINGTRAP
+122 =	HT_BLASTMINE
+123 =	HT_CLAYMORETRAP
+124 =	HT_REMOVETRAP
+125 =	HT_TALKIEBOX
+126 =	HT_BEASTBANE
+127 =	HT_FALCON
+128 =	HT_STEELCROW
+129 =	HT_BLITZBEAT
+130 =	HT_DETECTING
+131 =	HT_SPRINGTRAP
+132 =	AS_RIGHT
+133 =	AS_LEFT
+134 =	AS_KATAR
+135 =	AS_CLOAKING
+136 =	AS_SONICBLOW
+137 =	AS_GRIMTOOTH
+138 =	AS_ENCHANTPOISON
+139 =	AS_POISONREACT
+140 =	AS_VENOMDUST
+141 =	AS_SPLASHER
+142 =	NV_FIRSTAID
+143 =	NV_TRICKDEAD
+144 =	SM_MOVINGRECOVERY
+145 =	SM_FATALBLOW
+146 =	SM_AUTOBERSERK
+147 =	AC_MAKINGARROW
+148 =	AC_CHARGEARROW
+149 =	TF_SPRINKLESAND
+150 =	TF_BACKSLIDING
+151 =	TF_PICKSTONE
+152 =	TF_THROWSTONE
+153 =	MC_CARTREVOLUTION
+154 =	MC_CHANGECART
+155 =	MC_LOUD
+156 =	AL_HOLYLIGHT
+157 =	MG_ENERGYCOAT
+158 =	NPC_PIERCINGATT
+159 =	NPC_MENTALBREAKER
+160 =	NPC_RANGEATTACK
+161 =	NPC_ATTRICHANGE
+162 =	NPC_CHANGEWATER
+163 =	NPC_CHANGEGROUND
+164 =	NPC_CHANGEFIRE
+165 =	NPC_CHANGEWIND
+166 =	NPC_CHANGEPOISON
+167 =	NPC_CHANGEHOLY
+168 =	NPC_CHANGEDARLNESS
+169 =	NPC_CHANGETELEKINESIS
+170 =	NPC_CRITICALSLASH
+171 =	NPC_COMBOATTACK
+172 =	NPC_GUIDEATTACK
+173 =	NPC_SELFDESTRUCTION
+174 =	NPC_SPLASHATTACK
+175 =	NPC_SUICIDE
+176 =	NPC_POISON
+177 =	NPC_BLINDATTACK
+178 =	NPC_SILENCEATTACK
+179 =	NPC_STUNATTACK
+180 =	NPC_PETRIFYATTACK
+181 =	NPC_CURSEATTACK
+182 =	NPC_SLEEPATTACK
+183 =	NPC_RANDOMATTACK
+184 =	NPC_WATERATTACK
+185 =	NPC_GROUNDATTACK
+186 =	NPC_FIREATTACK
+187 =	NPC_WINDATTACK
+188 =	NPC_POISONATTACK
+189 =	NPC_HOLYATTACK
+190 =	NPC_DARKNESSATTACK
+191 =	NPC_TELEKINESISATTACK
+192 =	NPC_MAGICALATTACK
+193 =	NPC_METAMORPHOSIS
+194 =	NPC_PROVOCATION
+195 =	NPC_SMOKING
+196 =	NPC_SUMMONSLAVE
+197 =	NPC_EMOTION
+198 =	NPC_TRANSFORMATION
+199 =	NPC_BLOODDRAIN
+200 =	NPC_ENERGYDRAIN
+201 =	NPC_KEEPING
+202 =	NPC_DARKBREATH
+203 =	NPC_DARKBLESSING
+204 =	NPC_BARRIER
+205 =	NPC_DEFENDER
+206 =	NPC_LICK
+207 =	NPC_HALLUCINATION
+208 =	NPC_REBIRTH
+209 =	NPC_SUMMONMONSTER
+210 =	RG_SNATCHER
+211 =	RG_STEALCOIN
+212 =	RG_BACKSTAP
+213 =	RG_TUNNELDRIVE
+214 =	RG_RAID
+215 =	RG_STRIPWEAPON
+216 =	RG_STRIPSHIELD
+217 =	RG_STRIPARMOR
+218 =	RG_STRIPHELM
+219 =	RG_INTIMIDATE
+220 =	RG_GRAFFITI
+221 =	RG_FLAGGRAFFITI
+222 =	RG_CLEANER
+223 =	RG_GANGSTER
+224 =	RG_COMPULSION
+225 =	RG_PLAGIARISM
+226 =	AM_AXEMASTERY
+227 =	AM_LEARNINGPOTION
+228 =	AM_PHARMACY
+229 =	AM_DEMONSTRATION
+230 =	AM_ACIDTERROR
+231 =	AM_POTIONPITCHER
+232 =	AM_CANNIBALIZE
+233 =	AM_SPHEREMINE
+234 =	AM_CP_WEAPON
+235 =	AM_CP_SHIELD
+236 =	AM_CP_ARMOR
+237 =	AM_CP_HELM
+248 =	CR_TRUST
+249 =	CR_AUTOGUARD
+250 =	CR_SHIELDCHARGE
+251 =	CR_SHIELDBOOMERANG
+252 =	CR_REFLECTSHIELD
+253 =	CR_HOLYCROSS
+254 =	CR_GRANDCROSS
+255 =	CR_DEVOTION
+256 =	CR_PROVIDENCE
+257 =	CR_DEFENDER
+258 =	CR_SPEARQUICKEN
+259 =	MO_IRONHAND
+260 =	MO_SPIRITSRECOVERY
+261 =	MO_CALLSPIRITS
+262 =	MO_ABSORBSPIRITS
+263 =	MO_TRIPLEATTACK
+264 =	MO_BODYRELOCATION
+265 =	MO_DODGE
+266 =	MO_INVESTIGATE
+267 =	MO_FINGEROFFENSIVE
+268 =	MO_STEELBODY
+269 =	MO_BLADESTOP
+270 =	MO_EXPLOSIONSPIRITS
+271 =	MO_EXTREMITYFIST
+272 =	MO_CHAINCOMBO
+273 =	MO_COMBOFINISH
+274 =	SA_ADVANCEDBOOK
+275 =	SA_CASTCANCEL
+276 =	SA_MAGICROD
+277 =	SA_SPELLBREAKER
+278 =	SA_FREECAST
+279 =	SA_AUTOSPELL
+280 =	SA_FLAMELAUNCHER
+281 =	SA_FROSTWEAPON
+282 =	SA_LIGHTNINGLOADER
+283 =	SA_SEISMICWEAPON
+284 =	SA_DRAGONOLOGY
+285 =	SA_VOLCANO
+286 =	SA_DELUGE
+287 =	SA_VIOLENTGALE
+288 =	SA_LANDPROTECTOR
+289 =	SA_DISPELL
+290 =	SA_ABRACADABRA
+291 =	SA_MONOCELL
+292 =	SA_CLASSCHANGE
+293 =	SA_SUMMONMONSTER
+294 =	SA_REVERSEORCISH
+295 =	SA_DEATH
+296 =	SA_FORTUNE
+297 =	SA_TAMINGMONSTER
+298 =	SA_QUESTION
+299 =	SA_GRAVITY
+300 =	SA_LEVELUP
+301 =	SA_INSTANTDEATH
+302 =	SA_FULLRECOVERY
+303 =	SA_COMA
+304 =	BD_ADAPTATION
+305 =	BD_ENCORE
+306 =	BD_LULLABY
+307 =	BD_RICHMANKIM
+308 =	BD_ETERNALCHAOS
+309 =	BD_DRUMBATTLEFIELD
+310 =	BD_RINGNIBELUNGEN
+311 =	BD_ROKISWEIL
+312 =	BD_INTOABYSS
+313 =	BD_SIEGFRIED
+315 =	BA_MUSICALLESSON
+316 =	BA_MUSICALSTRIKE
+317 =	BA_DISSONANCE
+318 =	BA_FROSTJOKE
+319 =	BA_WHISTLE
+320 =	BA_ASSASSINCROSS
+321 =	BA_POEMBRAGI
+322 =	BA_APPLEIDUN
+323 =	DC_DANCINGLESSON
+324 =	DC_THROWARROW
+325 =	DC_UGLYDANCE
+326 =	DC_SCREAM
+327 =	DC_HUMMING
+328 =	DC_DONTFORGETME
+329 =	DC_FORTUNEKISS
+330 =	DC_SERVICEFORYOU
+334 =	WE_MALE
+335 =	WE_FEMALE
+336 =	WE_CALLPARTNER
+355 =	LK_AURABLADE
+356 =	LK_PARRYING
+357 =	LK_CONCENTRATION
+358 =	LK_TENSIONRELAX
+359 =	LK_BERSERK
+361 =	HP_ASSUMPTIO
+362 =	HP_BASILICA
+363 =	HP_MEDITATIO
+364 =	HW_SOULDRAIN
+365 =	HW_MAGICCRASHER
+366 =	HW_MAGICPOWER
+367 =	PA_PRESSURE
+368 =	PA_SACRIFICE
+369 =	PA_GOSPEL
+370 =	CH_PALMSTRIKE
+371 =	CH_TIGERFIST
+372 =	CH_CHAINCRUSH
+373 =	PF_HPCONVERSION
+374 =	PF_SOULCHANGE
+375 =	PF_SOULBURN
+376 =	ASC_KATAR
+377 =	ASC_HALLUCINATION
+378 =	ASC_EDP
+379 =	ASC_BREAKER
+380 =	SN_SIGHT
+381 =	SN_FALCONASSAULT
+382 =	SN_SHARPSHOOTING
+383 =	SN_WINDWALK
+384 =	WS_MELTDOWN
+385 =	WS_CREATECOIN
+386 =	WS_CREATENUGGET
+387 =	WS_CARTBOOST
+388 =	WS_SYSTEMCREATE
+389 =	ST_CHASEWALK
+390 =	ST_REJECTSWORD
+392 =	CR_ALCHEMY
+393 =	CR_SYNTHESISPOTION
+394 =	CG_ARROWVULCAN
+395 =	CG_MOONLIT
+396 =	CG_MARIONETTE
+397 =	LK_SPIRALPIERCE
+398 =	LK_HEADCRUSH
+399 =	LK_JOINTBEAT
+400 =	HW_NAPALMVULCAN
+401 =	CH_SOULCOLLECT
+402 =	PF_MINDBREAKER
+403 =	PF_MEMORIZE
+404 =	PF_FOGWALL
+405 =	PF_SPIDERWEB
+406 =	ASC_METEORASSAULT
+407 =	ASC_CDP
+408 =	WE_BABY
+409 =	WE_CALLPARENT
+410 =	WE_CALLBABY
+411 =	TK_RUN
+412 =	TK_READYSTORM
+413 =	TK_STORMKICK
+414 =	TK_READYDOWN
+415 =	TK_DOWNKICK
+416 =	TK_READYTURN
+417 =	TK_TURNKICK
+418 =	TK_READYCOUNTER
+419 =	TK_COUNTER
+420 =	TK_DODGE
+421 =	TK_JUMPKICK
+422 =	TK_HPTIME
+423 =	TK_SPTIME
+424 =	TK_POWER
+425 =	TK_SEVENWIND
+426 =	TK_HIGHJUMP
+427 =	SG_FEEL
+428 =	SG_SUN_WARM
+429 =	SG_MOON_WARM
+430 =	SG_STAR_WARM
+431 =	SG_SUN_COMFORT
+432 =	SG_MOON_COMFORT
+433 =	SG_STAR_COMFORT
+434 =	SG_HATE
+435 =	SG_SUN_ANGER
+436 =	SG_MOON_ANGER
+437 =	SG_STAR_ANGER
+438 =	SG_SUN_BLESS
+439 =	SG_MOON_BLESS
+440 =	SG_STAR_BLESS
+441 =	SG_DEVIL
+442 =	SG_FRIEND
+443 =	SG_KNOWLEDGE
+444 =	SG_FUSION
+445 =	SL_ALCHEMIST
+446 =	AM_BERSERKPITCHER
+447 =	SL_MONK
+448 =	SL_STAR
+449 =	SL_SAGE
+450 =	SL_CRUSADER
+451 =	SL_SUPERNOVICE
+452 =	SL_KNIGHT
+453 =	SL_WIZARD
+454 =	SL_PRIEST
+455 =	SL_BARDDANCER
+456 =	SL_ROGUE
+457 =	SL_ASSASIN
+458 =	SL_BLACKSMITH
+459 =	BS_ADRENALINE2
+460 =	SL_HUNTER
+461 =	SL_SOULLINKER
+462 =	SL_KAIZEL
+463 =	SL_KAAHI
+464 =	SL_KAUPE
+465 =	SL_KAITE
+466 =	SL_KAINA
+467 =	SL_STIN
+468 =	SL_STUN
+469 =	SL_SMA
+470 =	SL_SWOO
+471 =	SL_SKE
+472 =	SL_SKA
+10000 =	GD_APPROVAL
+10001 =	GD_KAFRACONTRACT
+10002 =	GD_GUARDRESEARCH
+10003 =	GD_CHARISMA
+10004 =	GD_EXTENSION
+
+// ************************
+// * Item DB - Use Script *
+// ************************
+itemskill:
+	-Format: itemskill skill_id,skill_lvl,"name";
+	-Example: itemskill 28,3,"Heal"; //Healing skill
+
+itemheal:
+	-Format: itemheal hp,sp;
+	-Example: itemheal 30,0; //+30 HP, +0 SP.
+
+sc_start:
+	-Format: sc_start SC_CONSTANT,duration,value;
+	-Example: sc_start SC_POISON,1800,; //Starts Poison Status for 30 seconds
+
+sc_end:
+	-Format: sc_end	SC_CONSTANT;
+	-Example: sc_end SC_BLIND; //Ends Blind Status
+
+warp:
+	-Format: warp "map",x,y;
+	-Example: warp "Random",0,0; //Fly wing
+	-Example: warp "SavePoint",0,0; //Butterfly wing
+
+getitem:
+	-Format: getitem item_id,count;
+	-Example: getitem 512,2; //Gives you two Apples
+
+produce:
+	-Format: produce produce_type;
+	-Example: produce 16; //Mini-furnace
+
+pet:
+	-Format: pet pet_id;
+	-Example: pet 1002; //Taming item for Poring
+
+monster:
+	-Example: monster "this",0,0,"--ja--",-1,1,""; //Dead branch
+
+percentheal:
+	-Format: percentheal percent_hp,percent_sp;
+	-Example: percentheal 100,100; //Heals you 100% of both HP and SP
+
+// **************************
+// * Item DB - Equip Script *
+// **************************

+ 2 - 0
src/common/mmo.h

@@ -14,6 +14,8 @@
 #define RETCODE "\n"	// (LF�FUnixŒn�j
 #endif
 
+#define RET RETCODE
+
 #define FIFOSIZE_SERVERLINK	128*1024
 
 // set to 0 to not check IP of player between each server.

+ 59 - 30
src/login/login.c

@@ -191,6 +191,46 @@ int isGM(int account_id) {
 	return 0;
 }
 
+//----------------------------------------------------------------------
+// Adds a new GM using acc id and level
+//----------------------------------------------------------------------
+void addGM(int account_id, int level) {
+	int i;
+	int do_add = 0;
+	for(i = 0; i < auth_num; i++) {
+		if (auth_dat[i].account_id==account_id) {
+			do_add = 1;
+			break;
+		}
+	}
+	for(i = 0; i < GM_num; i++)
+		if (gm_account_db[i].account_id == account_id) {
+			if (gm_account_db[i].level == level)
+				printf("addGM: GM account %d defined twice (same level: %d).\n", account_id, level);
+			else {
+				printf("addGM: GM account %d defined twice (levels: %d and %d).\n", account_id, gm_account_db[i].level, level);
+				gm_account_db[i].level = level;
+			}
+			return;
+		}
+		
+	// if new account
+	if (i == GM_num && do_add) {
+		if (GM_num >= GM_max) {
+			GM_max += 256;
+			gm_account_db = realloc(gm_account_db, sizeof(struct gm_account) * GM_max);
+			memset(gm_account_db + (GM_max - 256), 0, sizeof(struct gm_account) * 256);
+		}
+		gm_account_db[GM_num].account_id = account_id;
+		gm_account_db[GM_num].level = level;
+		GM_num++;
+		if (GM_num >= 4000) {
+			printf("***WARNING: 4000 GM accounts found. Next GM accounts are not read.\n");
+			login_log("***WARNING: 4000 GM accounts found. Next GM accounts are not read." RETCODE);
+		}
+	}
+}
+
 //-------------------------------------------------------
 // Reading function of GM accounts file (and their level)
 //-------------------------------------------------------
@@ -198,8 +238,9 @@ int read_gm_account() {
 	char line[512];
 	FILE *fp;
 	int account_id, level;
-	int i, line_counter;
+	int line_counter;
 	struct stat file_stat;
+	int start_range = 0, end_range = 0, is_range = 0, current_id = 0;
 
 	if(gm_account_db) free(gm_account_db);
 	GM_num = 0;
@@ -227,8 +268,9 @@ int read_gm_account() {
 		line_counter++;
 		if ((line[0] == '/' && line[1] == '/') || line[0] == '\0' || line[0] == '\n' || line[0] == '\r')
 			continue;
-		if (sscanf(line, "%d %d", &account_id, &level) != 2 && sscanf(line, "%d: %d", &account_id, &level) != 2)
-			printf("read_gm_account: file [%s], invalid 'id_acount level' format (line #%d).\n", GM_account_filename, line_counter);
+		is_range = (sscanf(line, "%d%*[-~]%d %d",&start_range,&end_range,&level)==3); // ID Range [MC Cameri]
+		if (!is_range && sscanf(line, "%d %d", &account_id, &level) != 2 && sscanf(line, "%d: %d", &account_id, &level) != 2)
+			printf("read_gm_account: file [%s], invalid 'acount_id|range level' format (line #%d).\n", GM_account_filename, line_counter);
 		else if (level <= 0)
 			printf("read_gm_account: file [%s] %dth account (line #%d) (invalid level [0 or negative]: %d).\n", GM_account_filename, GM_num+1, line_counter, level);
 		else {
@@ -236,37 +278,23 @@ int read_gm_account() {
 				printf("read_gm_account: file [%s] %dth account (invalid level, but corrected: %d->99).\n", GM_account_filename, GM_num+1, level);
 				level = 99;
 			}
-			for(i = 0; i < GM_num; i++)
-				if (gm_account_db[i].account_id == account_id) {
-					if (gm_account_db[i].level == level)
-						printf("read_gm_account: GM account %d defined twice (same level: %d).\n", account_id, level);
-					else {
-						printf("read_gm_account: GM account %d defined twice (levels: %d and %d).\n", account_id, gm_account_db[i].level, level);
-						gm_account_db[i].level = level;
-					}
-					break;
-				}
-			// if new account
-			if (i == GM_num) {
-				if (GM_num >= GM_max) {
-					GM_max += 256;
-					gm_account_db = realloc(gm_account_db, sizeof(struct gm_account) * GM_max);
-					memset(gm_account_db + (GM_max - 256), 0, sizeof(struct gm_account) * 256);
-				}
-				gm_account_db[GM_num].account_id = account_id;
-				gm_account_db[GM_num].level = level;
-				GM_num++;
-				if (GM_num >= 4000) {
-					printf("***WARNING: 4000 GM accounts found. Next GM accounts are not readed.\n");
-					login_log("***WARNING: 4000 GM accounts found. Next GM accounts are not readed." RETCODE);
-				}
+			if (is_range) {
+				if (start_range==end_range)
+					printf("read_gm_account: file [%s] invalid range, beginning of range is equal to end of range (line #%d).\n", GM_account_filename, line_counter);
+				else if (start_range>end_range)
+					printf("read_gm_account: file [%s] invalid range, beginning of range must be lower than end of range (line #%d).\n", GM_account_filename, line_counter);
+				else 
+					for (current_id = start_range;current_id<=end_range;current_id++)
+						addGM(current_id,level);
+			} else {
+				addGM(account_id,level);
 			}
 		}
 	}
 	fclose(fp);
 
-	printf("read_gm_account: file '%s' readed (%d GM accounts found).\n", GM_account_filename, GM_num);
-	login_log("read_gm_account: file '%s' readed (%d GM accounts found)." RETCODE, GM_account_filename, GM_num);
+	printf("read_gm_account: file '%s' read (%d GM accounts found).\n", GM_account_filename, GM_num);
+	login_log("read_gm_account: file '%s' read (%d GM accounts found)." RETCODE, GM_account_filename, GM_num);
 
 	return 0;
 }
@@ -447,6 +475,7 @@ int search_account_index(char* account_name) {
 
 	quantity = 0;
 	index = -1;
+
 	for(i = 0; i < auth_num; i++) {
 		// Without case sensitive check (increase the number of similar account names found)
 		if (stricmp(auth_dat[i].userid, account_name) == 0) {
@@ -3872,8 +3901,8 @@ int do_init(int argc, char **argv) {
 	gm_account_db = NULL;
 	GM_num = 0;
 	GM_max = 0;
-	read_gm_account();
 	mmo_auth_init();
+	read_gm_account();
 //	set_termfunc(mmo_auth_sync);
 	set_defaultparse(parse_login);
 	login_fd = make_listen_port(login_port);

+ 17 - 0
src/map/atcommand.c

@@ -220,6 +220,7 @@ ATCOMMAND_FUNC(refresh); // by MC Cameri
 ATCOMMAND_FUNC(petid); // by MC Cameri
 ATCOMMAND_FUNC(identify); // by MC Cameri
 ATCOMMAND_FUNC(gmotd); // Added by MC Cameri, created by davidsiaw
+ATCOMMAND_FUNC(misceffect); // by MC Cameri
 
 #ifndef TXT_ONLY
 ATCOMMAND_FUNC(checkmail); // [Valaris]
@@ -475,6 +476,7 @@ static AtCommandInfo atcommand_info[] = {
 	{ AtCommand_PetId,	    	    "@petid",			40, atcommand_petid }, // by MC Cameri
 	{ AtCommand_Identify,	   	    "@identify",		40, atcommand_identify }, // by MC Cameri
 	{ AtCommand_Gmotd,				"@gmotd",			 0, atcommand_gmotd }, // Added by MC Cameri, created by davidsiaw
+	{ AtCommand_MiscEffect,			"@misceffect",		50, atcommand_misceffect }, // by MC Cameri
 
 #ifndef TXT_ONLY // sql-only commands
 	{ AtCommand_CheckMail,			"@checkmail",		 1, atcommand_listmail }, // [Valaris]
@@ -7914,6 +7916,21 @@ atcommand_gmotd(
 		return 0;
 }
 
+int atcommand_misceffect(
+	const int fd, struct map_session_data* sd,
+	const char* command, const char* message)
+{
+	int effect = 0;
+	nullpo_retr(-1, sd);
+	if (!message || !*message)
+		return -1;
+	if (sscanf(message, "%d", &effect) < 1)
+		return -1;
+	clif_misceffect(&sd->bl,effect);
+	
+	return 0;
+}
+
 #ifndef TXT_ONLY  /* Begin SQL-Only commands */
 
 /*==========================================

+ 1 - 0
src/map/atcommand.h

@@ -200,6 +200,7 @@ enum AtCommandType {
 	AtCommand_PetId, // by MC Cameri
 	AtCommand_Identify, // by MC Cameri
 	AtCommand_Gmotd, // Added by MC Cameri, created by davidsiaw
+	AtCommand_MiscEffect, // by MC Cameri
 
 	// SQL-only commands start
 #ifndef TXT_ONLY 

+ 1 - 0
src/map/charcommand.c

@@ -408,6 +408,7 @@ int charcommand_petfriendly(
 					t = pl_sd->pet.intimate;
 					pl_sd->pet.intimate = friendly;
 					clif_send_petstatus(pl_sd);
+					clif_pet_emotion(pl_sd->pd,0);
 					if (battle_config.pet_status_support) {
 						if ((pl_sd->pet.intimate > 0 && t <= 0) ||
 						    (pl_sd->pet.intimate <= 0 && t > 0)) {

+ 5 - 4
src/map/script.c

@@ -2916,12 +2916,13 @@ int buildin_getequipisenableref(struct script_state *st)
 	num=conv_num(st,& (st->stack->stack_data[st->start+2]));
 	sd=script_rid2sd(st);
 	i=pc_checkequip(sd,equip[num-1]);
-	if(i >= 0 && num<7 && sd->inventory_data[i] && (num!=1 || sd->inventory_data[i]->def > 1
+	if(i >= 0 && num<7 && sd->inventory_data[i] && (num!=1 
+				 || sd->inventory_data[i]->def > 1
 	             || (sd->inventory_data[i]->def==1 && sd->inventory_data[i]->equip_script==NULL)
-	             || (sd->inventory_data[i]->def<=0 && sd->inventory_data[i]->equip_script!=NULL))
-	   ){
+	             || (sd->inventory_data[i]->def<=0 && sd->inventory_data[i]->equip_script!=NULL)))
+	{
 		push_val(st->stack,C_INT,1);
-	}else{
+	} else {
 		push_val(st->stack,C_INT,0);
 	}