diff options
-rw-r--r-- | Changelog.txt | 4 | ||||
-rw-r--r-- | conf-tmpl/GM_account.txt | 47 | ||||
-rw-r--r-- | conf-tmpl/charcommand_athena.conf | 4 | ||||
-rw-r--r-- | conf-tmpl/msg_athena.conf | 247 | ||||
-rw-r--r-- | doc/miscnotes.txt | 552 | ||||
-rw-r--r-- | src/common/mmo.h | 2 | ||||
-rw-r--r-- | src/login/login.c | 89 | ||||
-rw-r--r-- | src/map/atcommand.c | 17 | ||||
-rw-r--r-- | src/map/atcommand.h | 1 | ||||
-rw-r--r-- | src/map/charcommand.c | 1 | ||||
-rw-r--r-- | src/map/script.c | 9 |
11 files changed, 656 insertions, 317 deletions
diff --git a/Changelog.txt b/Changelog.txt index bd89c65f6..d85c7ca4a 100644 --- a/Changelog.txt +++ b/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.) diff --git a/conf-tmpl/GM_account.txt b/conf-tmpl/GM_account.txt index a7acfa038..ea41ab682 100644 --- a/conf-tmpl/GM_account.txt +++ b/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 diff --git a/conf-tmpl/charcommand_athena.conf b/conf-tmpl/charcommand_athena.conf index 729215dc5..1d55c0d98 100644 --- a/conf-tmpl/charcommand_athena.conf +++ b/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
diff --git a/conf-tmpl/msg_athena.conf b/conf-tmpl/msg_athena.conf index a485c4d1f..e9253f20d 100644 --- a/conf-tmpl/msg_athena.conf +++ b/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...
\ No newline at end of file diff --git a/doc/miscnotes.txt b/doc/miscnotes.txt new file mode 100644 index 000000000..4850b77f3 --- /dev/null +++ b/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 *
+// **************************
\ No newline at end of file diff --git a/src/common/mmo.h b/src/common/mmo.h index a21680191..865468a16 100644 --- a/src/common/mmo.h +++ b/src/common/mmo.h @@ -14,6 +14,8 @@ #define RETCODE "\n" // (LF:Unix系) #endif +#define RET RETCODE + #define FIFOSIZE_SERVERLINK 128*1024 // set to 0 to not check IP of player between each server. diff --git a/src/login/login.c b/src/login/login.c index 28cfafce9..8d7ce12a2 100644 --- a/src/login/login.c +++ b/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); diff --git a/src/map/atcommand.c b/src/map/atcommand.c index b8368db1d..7ea5eb975 100644 --- a/src/map/atcommand.c +++ b/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 */ /*========================================== diff --git a/src/map/atcommand.h b/src/map/atcommand.h index 77ecebf79..a87166064 100644 --- a/src/map/atcommand.h +++ b/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 diff --git a/src/map/charcommand.c b/src/map/charcommand.c index 6a8b0cbeb..c2e091302 100644 --- a/src/map/charcommand.c +++ b/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)) {
diff --git a/src/map/script.c b/src/map/script.c index 0f76d4ec7..f198d42fe 100644 --- a/src/map/script.c +++ b/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); } |