summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog.txt4
-rw-r--r--conf-tmpl/GM_account.txt47
-rw-r--r--conf-tmpl/charcommand_athena.conf4
-rw-r--r--conf-tmpl/msg_athena.conf247
-rw-r--r--doc/miscnotes.txt552
-rw-r--r--src/common/mmo.h2
-rw-r--r--src/login/login.c89
-rw-r--r--src/map/atcommand.c17
-rw-r--r--src/map/atcommand.h1
-rw-r--r--src/map/charcommand.c1
-rw-r--r--src/map/script.c9
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);
}