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

This commit is contained in:
mc_cameri 2004-11-21 14:31:17 +00:00
parent 241efbef4e
commit 0be79fa569
5 changed files with 193 additions and 148 deletions

View File

@ -1,5 +1,8 @@
Date Added Date Added
11/21 11/21
* @alive, @raisemap, @raise now display the resurrection skill animation [MC Cameri]
* @charpetrename(AtCommand) is now #petrename(CharCommand) [MC Cameri]
* @charjob/(AtCommand) is now #jobchange(CharCommand) [MC Cameri]
* Removed japanese interserver packets, should fix various problems (jumpto, where, charposreq). [Valaris] * Removed japanese interserver packets, should fix various problems (jumpto, where, charposreq). [Valaris]
* Added Yor's trade exploit bug fix. Added 2 skills bugs in the bugs.txt [Lupus] * Added Yor's trade exploit bug fix. Added 2 skills bugs in the bugs.txt [Lupus]
* Added charcommand.c/.h for the following reasons: [MC Cameri] * Added charcommand.c/.h for the following reasons: [MC Cameri]

View File

@ -107,7 +107,6 @@ ATCOMMAND_FUNC(petrename);
ATCOMMAND_FUNC(charpetrename); // by Yor ATCOMMAND_FUNC(charpetrename); // by Yor
ATCOMMAND_FUNC(recall); ATCOMMAND_FUNC(recall);
ATCOMMAND_FUNC(recallall); ATCOMMAND_FUNC(recallall);
ATCOMMAND_FUNC(character_job);
ATCOMMAND_FUNC(revive); ATCOMMAND_FUNC(revive);
ATCOMMAND_FUNC(character_stats); ATCOMMAND_FUNC(character_stats);
ATCOMMAND_FUNC(character_stats_all); ATCOMMAND_FUNC(character_stats_all);
@ -219,7 +218,8 @@ ATCOMMAND_FUNC(changesex); // by MC Cameri
ATCOMMAND_FUNC(mute); // celest ATCOMMAND_FUNC(mute); // celest
ATCOMMAND_FUNC(refresh); // by MC Cameri ATCOMMAND_FUNC(refresh); // by MC Cameri
ATCOMMAND_FUNC(petid); // by MC Cameri ATCOMMAND_FUNC(petid); // by MC Cameri
ATCOMMAND_FUNC(identify); ATCOMMAND_FUNC(identify); // by MC Cameri
ATCOMMAND_FUNC(gmotd); // Added by MC Cameri, created by davidsiaw
#ifndef TXT_ONLY #ifndef TXT_ONLY
ATCOMMAND_FUNC(checkmail); // [Valaris] ATCOMMAND_FUNC(checkmail); // [Valaris]
@ -299,8 +299,8 @@ static AtCommandInfo atcommand_info[] = {
{ AtCommand_Spawn, "@spawn", 50, atcommand_spawn }, { AtCommand_Spawn, "@spawn", 50, atcommand_spawn },
// { AtCommand_Spawn, "@summon", 50, atcommand_spawn }, // { AtCommand_Spawn, "@summon", 50, atcommand_spawn },
{ AtCommand_Monster, "@monster2", 50, atcommand_monster }, { AtCommand_Monster, "@monster2", 50, atcommand_monster },
{ AtCommand_MonsterSmall, "@monstersmall", 50, atcommand_monstersmall }, { AtCommand_MonsterSmall, "@monstersmall", 50, atcommand_monstersmall },
{ AtCommand_MonsterBig, "@monsterbig", 50, atcommand_monsterbig }, { AtCommand_MonsterBig, "@monsterbig", 50, atcommand_monsterbig },
{ AtCommand_KillMonster, "@killmonster", 60, atcommand_killmonster }, { AtCommand_KillMonster, "@killmonster", 60, atcommand_killmonster },
{ AtCommand_KillMonster2, "@killmonster2", 40, atcommand_killmonster2 }, { AtCommand_KillMonster2, "@killmonster2", 40, atcommand_killmonster2 },
{ AtCommand_Refine, "@refine", 60, atcommand_refine }, { AtCommand_Refine, "@refine", 60, atcommand_refine },
@ -324,10 +324,7 @@ static AtCommandInfo atcommand_info[] = {
{ AtCommand_PetFriendly, "@petfriendly", 40, atcommand_petfriendly }, { AtCommand_PetFriendly, "@petfriendly", 40, atcommand_petfriendly },
{ AtCommand_PetHungry, "@pethungry", 40, atcommand_pethungry }, { AtCommand_PetHungry, "@pethungry", 40, atcommand_pethungry },
{ AtCommand_PetRename, "@petrename", 1, atcommand_petrename }, { AtCommand_PetRename, "@petrename", 1, atcommand_petrename },
{ AtCommand_CharPetRename, "@charpetrename", 50, atcommand_charpetrename }, // by Yor
{ AtCommand_Recall, "@recall", 60, atcommand_recall }, // + /recall { AtCommand_Recall, "@recall", 60, atcommand_recall }, // + /recall
{ AtCommand_CharacterJob, "@charjob", 60, atcommand_character_job },
{ AtCommand_CharacterJob, "@charjobchange", 60, atcommand_character_job },
{ AtCommand_Revive, "@revive", 60, atcommand_revive }, { AtCommand_Revive, "@revive", 60, atcommand_revive },
{ AtCommand_CharacterStats, "@charstats", 40, atcommand_character_stats }, { AtCommand_CharacterStats, "@charstats", 40, atcommand_character_stats },
{ AtCommand_CharacterStatsAll, "@charstatsall", 40, atcommand_character_stats_all }, { AtCommand_CharacterStatsAll, "@charstatsall", 40, atcommand_character_stats_all },
@ -477,6 +474,7 @@ static AtCommandInfo atcommand_info[] = {
{ AtCommand_Refresh, "@refresh", 0, atcommand_refresh }, // by MC Cameri { AtCommand_Refresh, "@refresh", 0, atcommand_refresh }, // by MC Cameri
{ AtCommand_PetId, "@petid", 40, atcommand_petid }, // by MC Cameri { AtCommand_PetId, "@petid", 40, atcommand_petid }, // by MC Cameri
{ AtCommand_Identify, "@identify", 40, atcommand_identify }, // 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
#ifndef TXT_ONLY // sql-only commands #ifndef TXT_ONLY // sql-only commands
{ AtCommand_CheckMail, "@checkmail", 1, atcommand_listmail }, // [Valaris] { AtCommand_CheckMail, "@checkmail", 1, atcommand_listmail }, // [Valaris]
@ -2021,8 +2019,10 @@ int atcommand_alive(
const int fd, struct map_session_data* sd, const int fd, struct map_session_data* sd,
const char* command, const char* message) const char* command, const char* message)
{ {
if (pc_isdead(sd)) {
sd->status.hp = sd->status.max_hp; sd->status.hp = sd->status.max_hp;
sd->status.sp = sd->status.max_sp; sd->status.sp = sd->status.max_sp;
clif_skill_nodamage(&sd->bl,&sd->bl,ALL_RESURRECTION,4,1);
pc_setstand(sd); pc_setstand(sd);
if (battle_config.pc_invincible_time > 0) if (battle_config.pc_invincible_time > 0)
pc_setinvincibletimer(sd, battle_config.pc_invincible_time); pc_setinvincibletimer(sd, battle_config.pc_invincible_time);
@ -2030,8 +2030,10 @@ int atcommand_alive(
clif_updatestatus(sd, SP_SP); clif_updatestatus(sd, SP_SP);
clif_resurrection(&sd->bl, 1); clif_resurrection(&sd->bl, 1);
clif_displaymessage(fd, msg_table[16]); // You've been revived! It's a miracle! clif_displaymessage(fd, msg_table[16]); // You've been revived! It's a miracle!
return 0; return 0;
}
return -1;
} }
/*========================================== /*==========================================
@ -3959,47 +3961,6 @@ int atcommand_petrename(
return 0; return 0;
} }
/*==========================================
*
*------------------------------------------
*/
int atcommand_charpetrename(
const int fd, struct map_session_data* sd,
const char* command, const char* message)
{
char character[100];
struct map_session_data *pl_sd;
memset(character, '\0', sizeof(character));
if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
clif_displaymessage(fd, "Please, enter a player name (usage: @charpetrename <char name>).");
return -1;
}
if ((pl_sd = map_nick2sd(character)) != NULL) {
if (pl_sd->status.pet_id > 0 && pl_sd->pd) {
if (pl_sd->pet.rename_flag != 0) {
pl_sd->pet.rename_flag = 0;
intif_save_petdata(pl_sd->status.account_id, &pl_sd->pet);
clif_send_petstatus(pl_sd);
clif_displaymessage(fd, msg_table[189]); // This player can now rename his/her pet.
} else {
clif_displaymessage(fd, msg_table[190]); // This player can already rename his/her pet.
return -1;
}
} else {
clif_displaymessage(fd, msg_table[191]); // Sorry, but this player has no pet.
return -1;
}
} else {
clif_displaymessage(fd, msg_table[3]); // Character not found.
return -1;
}
return 0;
}
/*========================================== /*==========================================
* *
*------------------------------------------ *------------------------------------------
@ -4051,87 +4012,6 @@ atcommand_recall(
return 0; return 0;
} }
/*==========================================
* upper指定で転生や養子も可能
*------------------------------------------
*/
int atcommand_character_job(
const int fd, struct map_session_data* sd,
const char* command, const char* message)
{
char character[100];
struct map_session_data* pl_sd;
int job = 0, upper = -1;
memset(character, '\0', sizeof(character));
if (!message || !*message) {
clif_displaymessage(fd, "Please, enter a job and a player name (usage: @charjob/@charjobchange <job ID> <char name>).");
return -1;
}
if (sscanf(message, "%d %d %99[^\n]", &job, &upper, character) < 3) { //upper指定してある
upper = -1;
if (sscanf(message, "%d %99[^\n]", &job, character) < 2) { //upper指定してない上に何か足りない
clif_displaymessage(fd, "Please, enter a job and a player name (usage: @charjob/@charjobchange <job ID> <char name>).");
return -1;
}
}
if ((pl_sd = map_nick2sd(character)) != NULL) {
if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can change job only to lower or same level
if ((job >= 0 && job < MAX_PC_CLASS)) {
// fix pecopeco display
if ((job != 13 && job != 21 && job != 4014 && job != 4022)) {
if (pc_isriding(sd)) {
if (pl_sd->status.class == 13)
pl_sd->status.class = pl_sd->view_class = 7;
if (pl_sd->status.class == 21)
pl_sd->status.class = pl_sd->view_class = 14;
if (pl_sd->status.class == 4014)
pl_sd->status.class = pl_sd->view_class = 4008;
if (pl_sd->status.class == 4022)
pl_sd->status.class = pl_sd->view_class = 4015;
pl_sd->status.option &= ~0x0020;
clif_changeoption(&pl_sd->bl);
pc_calcstatus(pl_sd, 0);
}
} else {
if (!pc_isriding(sd)) {
if (job == 13)
job = 7;
if (job == 21)
job = 14;
if (job == 4014)
job = 4008;
if (job == 4022)
job = 4015;
}
}
if (pc_jobchange(pl_sd, job, upper) == 0)
clif_displaymessage(fd, msg_table[48]); // Character's job changed.
else {
clif_displaymessage(fd, msg_table[192]); // Impossible to change the character's job.
return -1;
}
} else {
clif_displaymessage(fd, msg_table[49]); // Invalid job ID.
return -1;
}
} else {
clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
return -1;
}
} else {
clif_displaymessage(fd, msg_table[3]); // Character not found.
return -1;
}
return 0;
}
/*========================================== /*==========================================
* *
*------------------------------------------ *------------------------------------------
@ -4151,14 +4031,19 @@ int atcommand_revive(
} }
if ((pl_sd = map_nick2sd(character)) != NULL) { if ((pl_sd = map_nick2sd(character)) != NULL) {
pl_sd->status.hp = pl_sd->status.max_hp; if (pc_isdead(sd)) {
pc_setstand(pl_sd); pl_sd->status.hp = pl_sd->status.max_hp;
if (battle_config.pc_invincible_time > 0) clif_skill_nodamage(&sd->bl,&sd->bl,ALL_RESURRECTION,4,1);
pc_setinvincibletimer(sd, battle_config.pc_invincible_time); pc_setstand(pl_sd);
clif_updatestatus(pl_sd, SP_HP); if (battle_config.pc_invincible_time > 0)
clif_updatestatus(pl_sd, SP_SP); pc_setinvincibletimer(sd, battle_config.pc_invincible_time);
clif_resurrection(&pl_sd->bl, 1); clif_updatestatus(pl_sd, SP_HP);
clif_displaymessage(fd, msg_table[51]); // Character revived. clif_updatestatus(pl_sd, SP_SP);
clif_resurrection(&pl_sd->bl, 1);
clif_displaymessage(fd, msg_table[51]); // Character revived.
return 0;
}
return -1;
} else { } else {
clif_displaymessage(fd, msg_table[3]); // Character not found. clif_displaymessage(fd, msg_table[3]); // Character not found.
return -1; return -1;
@ -4726,6 +4611,7 @@ int atcommand_doommap(
static void atcommand_raise_sub(struct map_session_data* sd) static void atcommand_raise_sub(struct map_session_data* sd)
{ {
if (sd && sd->state.auth && pc_isdead(sd)) { if (sd && sd->state.auth && pc_isdead(sd)) {
clif_skill_nodamage(&sd->bl,&sd->bl,ALL_RESURRECTION,4,1);
sd->status.hp = sd->status.max_hp; sd->status.hp = sd->status.max_hp;
sd->status.sp = sd->status.max_sp; sd->status.sp = sd->status.max_sp;
pc_setstand(sd); pc_setstand(sd);
@ -7995,6 +7881,34 @@ atcommand_identify(
return 0; return 0;
} }
/*==========================================
* @gmotd (Global MOTD)
* by davidsiaw :P
*------------------------------------------
*/
int
atcommand_gmotd(
const int fd, struct map_session_data* sd,
const char* command, const char* message)
{
char buf[256];
FILE *fp;
if( (fp = fopen(motd_txt, "r"))!=NULL){
while (fgets(buf, 250, fp) != NULL){
int i;
for( i=0; buf[i]; i++){
if( buf[i]=='\r' || buf[i]=='\n'){
buf[i]=0;
break;
}
}
intif_GMmessage(buf,strlen(buf)+1,8);
}
fclose(fp);
}
return 0;
}
#ifndef TXT_ONLY /* Begin SQL-Only commands */ #ifndef TXT_ONLY /* Begin SQL-Only commands */
/*========================================== /*==========================================

View File

@ -80,9 +80,7 @@ enum AtCommandType {
AtCommand_PetRename, AtCommand_PetRename,
AtCommand_CharPetRename, // by Yor AtCommand_CharPetRename, // by Yor
AtCommand_Recall, AtCommand_Recall,
AtCommand_CharacterJob, // AtCommand_CharacterJob, // Now #jobchange
AtCommand_CharacterJob2,
AtCommand_CharacterJob3,
AtCommand_Revive, AtCommand_Revive,
AtCommand_CharacterStats, AtCommand_CharacterStats,
AtCommand_CharacterStatsAll, AtCommand_CharacterStatsAll,
@ -201,6 +199,7 @@ enum AtCommandType {
AtCommand_Refresh, // by MC Cameri AtCommand_Refresh, // by MC Cameri
AtCommand_PetId, // by MC Cameri AtCommand_PetId, // by MC Cameri
AtCommand_Identify, // by MC Cameri AtCommand_Identify, // by MC Cameri
AtCommand_Gmotd, // Added by MC Cameri, created by davidsiaw
// SQL-only commands start // SQL-only commands start
#ifndef TXT_ONLY #ifndef TXT_ONLY

View File

@ -33,13 +33,17 @@ static char command_symbol = '#';
static char msg_table[1000][1024]; // Server messages (0-499 reserved for GM commands, 500-999 reserved for others) static char msg_table[1000][1024]; // Server messages (0-499 reserved for GM commands, 500-999 reserved for others)
#define CHARCOMMAND_FUNC(x) int charcommand_ ## x (const int fd, struct map_session_data* sd, const char* command, const char* message) #define CHARCOMMAND_FUNC(x) int charcommand_ ## x (const int fd, struct map_session_data* sd, const char* command, const char* message)
CHARCOMMAND_FUNC(jobchange);
CHARCOMMAND_FUNC(petrename);
#ifdef TXT_ONLY #ifdef TXT_ONLY
/* TXT_ONLY */ /* TXT_ONLY */
CHARCOMMAND_FUNC(test);
/* TXT_ONLY */ /* TXT_ONLY */
#else #else
/* SQL-only */ /* SQL-only */
//CHARCOMMAND_FUNC(funcname);
/* SQL Only */ /* SQL Only */
#endif #endif
@ -51,15 +55,17 @@ static char msg_table[1000][1024]; // Server messages (0-499 reserved for GM com
// First char of commands is configured in charcommand_athena.conf. Leave @ in this list for default value. // First char of commands is configured in charcommand_athena.conf. Leave @ in this list for default value.
// to set default level, read charcommand_athena.conf first please. // to set default level, read charcommand_athena.conf first please.
static CharCommandInfo charcommand_info[] = { static CharCommandInfo charcommand_info[] = {
{ CharCommandJobChange, "#job", 60, charcommand_jobchange },
{ CharCommandJobChange, "#jobchange", 60, charcommand_jobchange },
{ CharCommandPetRename, "#petrename", 50, charcommand_petrename },
#ifdef TXT_ONLY #ifdef TXT_ONLY
/* TXT_ONLY */ /* TXT_ONLY */
// { CharCommandType, "#name", level, charcommand_func },
{ CharCommandTest, "#test", 0, charcommand_test },
/* TXT_ONLY */ /* TXT_ONLY */
#else #else
/* SQL-only */ /* SQL-only */
// { CharCommandType, "#name", level, charcommand_func },
/* SQL Only */ /* SQL Only */
#endif #endif
@ -252,3 +258,124 @@ charcommand_test (const int fd, struct map_session_data* sd,
return 0; return 0;
} }
/*==========================================
* upper指定で転生や養子も可能
*------------------------------------------
*/
int charcommand_jobchange(
const int fd, struct map_session_data* sd,
const char* command, const char* message)
{
char character[100];
struct map_session_data* pl_sd;
int job = 0, upper = -1;
memset(character, '\0', sizeof(character));
if (!message || !*message) {
clif_displaymessage(fd, "Please, enter a job and a player name (usage: #job/#jobchange <job ID> <char name>).");
return -1;
}
if (sscanf(message, "%d %d %99[^\n]", &job, &upper, character) < 3) { //upper指定してある
upper = -1;
if (sscanf(message, "%d %99[^\n]", &job, character) < 2) { //upper指定してない上に何か足りない
clif_displaymessage(fd, "Please, enter a job and a player name (usage: #job/#jobchange <job ID> <char name>).");
return -1;
}
}
if ((pl_sd = map_nick2sd(character)) != NULL) {
if (pc_isGM(sd) >= pc_isGM(pl_sd)) { // you can change job only to lower or same level
if ((job >= 0 && job < MAX_PC_CLASS)) {
// fix pecopeco display
if ((job != 13 && job != 21 && job != 4014 && job != 4022)) {
if (pc_isriding(sd)) {
if (pl_sd->status.class == 13)
pl_sd->status.class = pl_sd->view_class = 7;
if (pl_sd->status.class == 21)
pl_sd->status.class = pl_sd->view_class = 14;
if (pl_sd->status.class == 4014)
pl_sd->status.class = pl_sd->view_class = 4008;
if (pl_sd->status.class == 4022)
pl_sd->status.class = pl_sd->view_class = 4015;
pl_sd->status.option &= ~0x0020;
clif_changeoption(&pl_sd->bl);
pc_calcstatus(pl_sd, 0);
}
} else {
if (!pc_isriding(sd)) {
if (job == 13)
job = 7;
if (job == 21)
job = 14;
if (job == 4014)
job = 4008;
if (job == 4022)
job = 4015;
}
}
if (pc_jobchange(pl_sd, job, upper) == 0)
clif_displaymessage(fd, msg_table[48]); // Character's job changed.
else {
clif_displaymessage(fd, msg_table[192]); // Impossible to change the character's job.
return -1;
}
} else {
clif_displaymessage(fd, msg_table[49]); // Invalid job ID.
return -1;
}
} else {
clif_displaymessage(fd, msg_table[81]); // Your GM level don't authorise you to do this action on this player.
return -1;
}
} else {
clif_displaymessage(fd, msg_table[3]); // Character not found.
return -1;
}
return 0;
}
/*==========================================
*
*------------------------------------------
*/
int charcommand_petrename(
const int fd, struct map_session_data* sd,
const char* command, const char* message)
{
char character[100];
struct map_session_data *pl_sd;
memset(character, '\0', sizeof(character));
if (!message || !*message || sscanf(message, "%99[^\n]", character) < 1) {
clif_displaymessage(fd, "Please, enter a player name (usage: #petrename <char name>).");
return -1;
}
if ((pl_sd = map_nick2sd(character)) != NULL) {
if (pl_sd->status.pet_id > 0 && pl_sd->pd) {
if (pl_sd->pet.rename_flag != 0) {
pl_sd->pet.rename_flag = 0;
intif_save_petdata(pl_sd->status.account_id, &pl_sd->pet);
clif_send_petstatus(pl_sd);
clif_displaymessage(fd, msg_table[189]); // This player can now rename his/her pet.
} else {
clif_displaymessage(fd, msg_table[190]); // This player can already rename his/her pet.
return -1;
}
} else {
clif_displaymessage(fd, msg_table[191]); // Sorry, but this player has no pet.
return -1;
}
} else {
clif_displaymessage(fd, msg_table[3]); // Character not found.
return -1;
}
return 0;
}

View File

@ -3,10 +3,12 @@
enum CharCommandType { enum CharCommandType {
CharCommand_None = -1, CharCommand_None = -1,
CharCommandJobChange,
CharCommandPetRename,
#ifdef TXT_ONLY #ifdef TXT_ONLY
/* TXT_ONLY */ /* TXT_ONLY */
CharCommandTest,
/* TXT_ONLY */ /* TXT_ONLY */
#else #else
/* SQL-only */ /* SQL-only */