summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Changelog-SVN.txt2
-rw-r--r--npc/Changelog.txt3
-rw-r--r--npc/cities/payon.txt29
-rw-r--r--src/char/char.c87
-rw-r--r--src/char_sql/char.c87
-rw-r--r--src/map/skill.c58
6 files changed, 243 insertions, 23 deletions
diff --git a/Changelog-SVN.txt b/Changelog-SVN.txt
index 3d7c75aba..57ee1e203 100644
--- a/Changelog-SVN.txt
+++ b/Changelog-SVN.txt
@@ -1,6 +1,8 @@
Date Added
03/17
+ * Added 2 char-server packets to support Freya's login server [celest]
+ * Rewrite on Full Strip [celest]
* Fixed heap corrupion in map.c caused while loading maps
[SVN 1241: MouseJstr]
* Re-fixed compile error in map.c -- sorry ^^; [celest]
diff --git a/npc/Changelog.txt b/npc/Changelog.txt
index 5c922e667..855db9912 100644
--- a/npc/Changelog.txt
+++ b/npc/Changelog.txt
@@ -35,6 +35,9 @@ Other Ppl
Date Added
======
+03/17
+ * Fixed more typos in /cities/payon.txt, thanks to TheUltimateEnd [celest]
+
03/16
* Fixed some typos in /cites/payon.txt, thanks to Hibiki [celest]
diff --git a/npc/cities/payon.txt b/npc/cities/payon.txt
index 207653b47..1f2d2dc97 100644
--- a/npc/cities/payon.txt
+++ b/npc/cities/payon.txt
@@ -6,13 +6,14 @@
//= Muad Dib (1.2)
//= Darkchild (1.3)
//===== Current Version: =====================================
-//= 1.3
+//= 1.4
//===== Compatible With: =====================================
//= Any eAthena Mod
//===== Description: =========================================
//= (New) Payon City Npcs
//===== Additional Comments: =================================
//= Most Credits To Muad Dib, Some Stuff By Me
+//= 1.4 - Corrected a few typos
//============================================================
payon.gat,190,115,0 script Lady 90,{
@@ -82,23 +83,25 @@ payon_in01.gat,180,7,0 script Waitress 90,{
next;
mes "[Waitress]";
mes "Where can I find the right person who is a really hot, sexy hunk, and who can take me out of this small place?";
- check Gender = 1,-,LStartF;
- mes "[Waitress]";
- mes "Hello, mister?";
+ if(Sex == 0) goto LStartF;
+ mes "[Waitress]";
+ mes "Hello, mister?";
+ goto L_Start;
LStartF:
mes "[Waitress]";
mes "Hello, lady?";
+L_Start:
next;
mes "[Waitress]";
mes "Grandma the fortuneteller told me that I would meet great luck in the near future!";
mes "But look at me, what's wrong with me!! I am leaving a managable life everyday!!";
mes "Oh..boy. What a dumb wishy-washy person I am.";
- emotion 6;
+ emotion 6;
next;
mes "[Waitress]";
mes "I am so sorry, I should haven't said this to you. Now I am acting like i'm stupid.";
mes "I am sorry dear, please forgive my misbehaviour.";
- emotion 4;
+ emotion 4;
next;
mes "[Waitress]";
mes "So, how may I help you? ";
@@ -124,7 +127,7 @@ L_Menu2:
emotion 5;
next;
mes "[Waitress]";
- mes "On the first place, she stayed here to mind her business, but ever since the chief recognized her talent, she's stayed in the central palace."
+ mes "On the first place, she stayed here to mind her business, but ever since the chief recognized her talent, she's stayed in the central palace.";
mes "You'd better go to there if you want to see her.";
close;
L_Menu3:
@@ -165,16 +168,18 @@ payon.gat,193,116,1 script Woman 66,{
mes "Hmm... you look as strong as a Rocker! How many monsters have you killed?";
mes "Let me tell you about a place where you can go train and become even stronger.";
emotion 20;
+ goto L_Start;
LStartF:
mes "Miss, how many monsters have you killed?";
mes "I know a very good place for you to go train and get good monster drops.";
emotion 20;
+L_Start:
next;
mes "[Woman]";
mes "I know of a cave near Archer Village. Just take the exit north of town and follow the path to your left.";
mes "The cave is full of monsters and their spawn rate is very high. Does it sound interesting to you?";
next;
- menu "It sounds dangerous."L_Menu1,"I think I need to fully prepare for that place.",L_Menu2,"Lady, you wear nice clothing~",L_Menu3;
+ menu "It sounds dangerous.",L_Menu1,"I think I need to fully prepare for that place.",L_Menu2,"Lady, you wear nice clothing~",L_Menu3;
L_Menu1:
mes "[Woman]";
mes "Oh don't be such a coward! It's just a simple cave filled with normal monsters. Archer Village is near by so you shouldn't be worried~ hohoho~";
@@ -214,12 +219,14 @@ payon.gat,190,119,5 script Woman 66,{
mes "Anyway, you look like a new face. Are you new in town?";
next;
mes "[Jim's Mother]";
- if(Sex == 0) goto LStartF;
+ if(Sex == 0) goto LStartF;
mes "... Oh, you have broad shoulders ... tehehe! Will you go out with me? I'd like to make you a nice dinner...(bats eyelashes)";
- emotion 30;
+ emotion 30;
+ goto L_Menu;
LStartF:
mes "Don't you think your dress is too lousy?";
mes "I don't like young ladies pounce up.";
+L_Menu:
next;
menu "Fortune Telling?",L_Menu1,"...Good Bye.",L_Menu2;
L_Menu1:
@@ -401,7 +408,7 @@ L_case:
menu "Cave?!",L_para1,"Chief?",L_para2,"Oh man I hate this stupid town~",L_para3;
L_para1:
mes "[Archer Wolt]";
- mes "Head north of town, you can see the cave I told you about."
+ mes "Head north of town, you can see the cave I told you about.";
mes "Inside there, you will encounter lots of ugly monsters such as bastard looking like a bat or the walking dead.";
mes "If we let them out of the place, they would invade our town. We frequently clean up the cave.";
next;
diff --git a/src/char/char.c b/src/char/char.c
index 9457ce89f..1a2b61389 100644
--- a/src/char/char.c
+++ b/src/char/char.c
@@ -1703,6 +1703,35 @@ int parse_tologin(int fd) {
RFIFOSKIP(fd,2);
break;
+ // Receiving authentification from Freya-type login server (to avoid char->login->char)
+ case 0x2719:
+ if (RFIFOREST(fd) < 18)
+ return 0;
+ // to conserv a maximum of authentification, search if account is already authentified and replace it
+ // that will reduce multiple connection too
+ for(i = 0; i < AUTH_FIFO_SIZE; i++)
+ if (auth_fifo[i].account_id == RFIFOL(fd,2))
+ break;
+ // if not found, use next value
+ if (i == AUTH_FIFO_SIZE) {
+ if (auth_fifo_pos >= AUTH_FIFO_SIZE)
+ auth_fifo_pos = 0;
+ i = auth_fifo_pos;
+ auth_fifo_pos++;
+ }
+ //printf("auth_fifo set (auth #%d) - account: %d, secure: %08x-%08x\n", i, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10));
+ auth_fifo[i].account_id = RFIFOL(fd,2);
+ auth_fifo[i].char_id = 0;
+ auth_fifo[i].login_id1 = RFIFOL(fd,6);
+ auth_fifo[i].login_id2 = RFIFOL(fd,10);
+ auth_fifo[i].delflag = 2; // 0: auth_fifo canceled/void, 2: auth_fifo received from login/map server in memory, 1: connection authentified
+ auth_fifo[i].char_pos = 0;
+ auth_fifo[i].connect_until_time = 0; // unlimited/unknown time by default (not display in map-server)
+ auth_fifo[i].ip = RFIFOL(fd,14);
+ //auth_fifo[i].map_auth = 0;
+ RFIFOSKIP(fd,18);
+ break;
+
case 0x2721: // gm reply
if (RFIFOREST(fd) < 10)
return 0;
@@ -1965,6 +1994,64 @@ int parse_tologin(int fd) {
RFIFOSKIP(fd,RFIFOW(fd,2));
break;
+ // Receive GM accounts [Freya login server packet by Yor]
+ case 0x2733:
+ // add test here to remember that the login-server is Freya-type
+ // sprintf (login_server_type, "Freya");
+ if (RFIFOREST(fd) < 7)
+ return 0;
+ {
+ unsigned char buf[32000];
+ int new_level = 0;
+ for(i = 0; i < GM_num; i++)
+ if (gm_account[i].account_id == RFIFOL(fd,2)) {
+ if (gm_account[i].level != (int)RFIFOB(fd,6)) {
+ gm_account[i].level = (int)RFIFOB(fd,6);
+ new_level = 1;
+ }
+ break;
+ }
+ // if not found, add it
+ if (i == GM_num) {
+ // limited to 4000, because we send information to char-servers (more than 4000 GM accounts???)
+ // int (id) + int (level) = 8 bytes * 4000 = 32k (limit of packets in windows)
+ if (((int)RFIFOB(fd,6)) > 0 && GM_num < 4000) {
+ if (GM_num == 0) {
+ gm_account = (struct gm_account*)aMalloc(sizeof(struct gm_account));
+ } else {
+ gm_account = (struct gm_account*)aRealloc(gm_account, sizeof(struct gm_account) * (GM_num + 1));
+ }
+ gm_account[GM_num].account_id = RFIFOL(fd,2);
+ gm_account[GM_num].level = (int)RFIFOB(fd,6);
+ new_level = 1;
+ GM_num++;
+ if (GM_num >= 4000) {
+ printf("***WARNING: 4000 GM accounts found. Next GM accounts are not readed.\n");
+ char_log("***WARNING: 4000 GM accounts found. Next GM accounts are not readed." RETCODE);
+ }
+ }
+ }
+ if (new_level == 1) {
+ int len;
+ printf("From login-server: receiving a GM account information (%d: level %d).\n", RFIFOL(fd,2), (int)RFIFOB(fd,6));
+ char_log("From login-server: receiving a GM account information (%d: level %d)." RETCODE, RFIFOL(fd,2), (int)RFIFOB(fd,6));
+ //create_online_files(); // not change online file for only 1 player (in next timer, that will be done
+ // send gm acccounts level to map-servers
+ len = 4;
+ WBUFW(buf,0) = 0x2b15;
+
+ for(i = 0; i < GM_num; i++) {
+ WBUFL(buf, len) = gm_account[i].account_id;
+ WBUFB(buf, len+4) = (unsigned char)gm_account[i].level;
+ len += 5;
+ }
+ WBUFW(buf, 2) = len;
+ mapif_sendall(buf, len);
+ }
+ }
+ RFIFOSKIP(fd,7);
+ break;
+
default:
printf("parse_tologin: unknown packet %x! \n", RFIFOW(fd,0));
session[fd]->eof = 1;
diff --git a/src/char_sql/char.c b/src/char_sql/char.c
index b920e8eb3..a56aedf3c 100644
--- a/src/char_sql/char.c
+++ b/src/char_sql/char.c
@@ -1555,6 +1555,35 @@ int parse_tologin(int fd) {
RFIFOSKIP(fd,2);
break;
+ // Receiving authentification from Freya-type login server (to avoid char->login->char)
+ case 0x2719:
+ if (RFIFOREST(fd) < 18)
+ return 0;
+ // to conserv a maximum of authentification, search if account is already authentified and replace it
+ // that will reduce multiple connection too
+ for(i = 0; i < AUTH_FIFO_SIZE; i++)
+ if (auth_fifo[i].account_id == RFIFOL(fd,2))
+ break;
+ // if not found, use next value
+ if (i == AUTH_FIFO_SIZE) {
+ if (auth_fifo_pos >= AUTH_FIFO_SIZE)
+ auth_fifo_pos = 0;
+ i = auth_fifo_pos;
+ auth_fifo_pos++;
+ }
+ //printf("auth_fifo set (auth #%d) - account: %d, secure: %08x-%08x\n", i, RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10));
+ auth_fifo[i].account_id = RFIFOL(fd,2);
+ auth_fifo[i].char_id = 0;
+ auth_fifo[i].login_id1 = RFIFOL(fd,6);
+ auth_fifo[i].login_id2 = RFIFOL(fd,10);
+ auth_fifo[i].delflag = 2; // 0: auth_fifo canceled/void, 2: auth_fifo received from login/map server in memory, 1: connection authentified
+ auth_fifo[i].char_pos = 0;
+ auth_fifo[i].connect_until_time = 0; // unlimited/unknown time by default (not display in map-server)
+ auth_fifo[i].ip = RFIFOL(fd,14);
+ //auth_fifo[i].map_auth = 0;
+ RFIFOSKIP(fd,18);
+ break;
+
/* case 0x2721: // gm reply. I don't want to support this function.
printf("0x2721:GM reply\n");
{
@@ -1707,6 +1736,64 @@ int parse_tologin(int fd) {
RFIFOSKIP(fd,11);
break;
+ // Receive GM accounts [Freya login server packet by Yor]
+ case 0x2733:
+ // add test here to remember that the login-server is Freya-type
+ // sprintf (login_server_type, "Freya");
+ if (RFIFOREST(fd) < 7)
+ return 0;
+ {
+ unsigned char buf[32000];
+ int new_level = 0;
+ for(i = 0; i < GM_num; i++)
+ if (gm_account[i].account_id == RFIFOL(fd,2)) {
+ if (gm_account[i].level != (int)RFIFOB(fd,6)) {
+ gm_account[i].level = (int)RFIFOB(fd,6);
+ new_level = 1;
+ }
+ break;
+ }
+ // if not found, add it
+ if (i == GM_num) {
+ // limited to 4000, because we send information to char-servers (more than 4000 GM accounts???)
+ // int (id) + int (level) = 8 bytes * 4000 = 32k (limit of packets in windows)
+ if (((int)RFIFOB(fd,6)) > 0 && GM_num < 4000) {
+ if (GM_num == 0) {
+ gm_account = (struct gm_account*)aMalloc(sizeof(struct gm_account));
+ } else {
+ gm_account = (struct gm_account*)aRealloc(gm_account, sizeof(struct gm_account) * (GM_num + 1));
+ }
+ gm_account[GM_num].account_id = RFIFOL(fd,2);
+ gm_account[GM_num].level = (int)RFIFOB(fd,6);
+ new_level = 1;
+ GM_num++;
+ if (GM_num >= 4000) {
+ printf("***WARNING: 4000 GM accounts found. Next GM accounts are not readed.\n");
+ char_log("***WARNING: 4000 GM accounts found. Next GM accounts are not readed." RETCODE);
+ }
+ }
+ }
+ if (new_level == 1) {
+ int len;
+ printf("From login-server: receiving a GM account information (%d: level %d).\n", RFIFOL(fd,2), (int)RFIFOB(fd,6));
+ char_log("From login-server: receiving a GM account information (%d: level %d)." RETCODE, RFIFOL(fd,2), (int)RFIFOB(fd,6));
+ //create_online_files(); // not change online file for only 1 player (in next timer, that will be done
+ // send gm acccounts level to map-servers
+ len = 4;
+ WBUFW(buf,0) = 0x2b15;
+
+ for(i = 0; i < GM_num; i++) {
+ WBUFL(buf, len) = gm_account[i].account_id;
+ WBUFB(buf, len+4) = (unsigned char)gm_account[i].level;
+ len += 5;
+ }
+ WBUFW(buf, 2) = len;
+ mapif_sendall(buf, len);
+ }
+ }
+ RFIFOSKIP(fd,7);
+ break;
+
default:
printf("set eof.\n");
session[fd]->eof = 1;
diff --git a/src/map/skill.c b/src/map/skill.c
index f75ffdd6a..5310618b3 100644
--- a/src/map/skill.c
+++ b/src/map/skill.c
@@ -1247,7 +1247,7 @@ int skill_attack( int attack_type, struct block_list* src, struct block_list *ds
return 0;
if(src->type == BL_PC && pc_isdead((struct map_session_data *)src)) //術者?がPCですでに死んでいたら何もしない
return 0;
- if(dsrc->type == BL_PC && pc_isdead((struct map_session_data *)dsrc)) //術者?がPCですでに死んでいたら何もしない
+ if(src != dsrc && dsrc->type == BL_PC && pc_isdead((struct map_session_data *)dsrc)) //術者?がPCですでに死んでいたら何もしない
return 0;
if(bl->type == BL_PC && pc_isdead((struct map_session_data *)bl)) //?象がPCですでに死んでいたら何もしない
return 0;
@@ -2751,7 +2751,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
struct mob_data *md=NULL;
struct mob_data *dstmd=NULL;
int i,abra_skillid=0,abra_skilllv;
- int sc_def_vit,sc_def_mdef,strip_time,strip_per;
+ int sc_def_vit,sc_def_mdef;
int sc_dex,sc_luk;
//クラスチェンジ用ボスモンスタ?ID
int changeclass[]={1038,1039,1046,1059,1086,1087,1112,1115
@@ -3777,10 +3777,12 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
case RG_STRIPSHIELD: /* ストリップシールド */
case RG_STRIPARMOR: /* ストリップアーマー */
case RG_STRIPHELM: /* ストリップヘルム */
- case ST_FULLSTRIP: // Celest
{
- struct status_change *tsc_data = status_get_sc_data(bl);
- int scid, cp_scid = 0, equip, strip_fix, strip_num = 0;
+ struct status_change *tsc_data;
+ int strip_time, strip_per, strip_fix;
+ int scid, cp_scid = 0, equip;
+
+ tsc_data = status_get_sc_data(bl);
scid = SkillStatusChangeTable[skillid];
switch (skillid) {
case RG_STRIPWEAPON:
@@ -3799,17 +3801,13 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
equip = EQP_HELM;
cp_scid = SC_CP_HELM;
break;
- case ST_FULLSTRIP:
- equip = EQP_WEAPON | EQP_SHIELD | EQP_ARMOR | EQP_HELM;
- strip_num = 3;
- break;
default:
map_freeblock_unlock();
return 1;
}
if (tsc_data && (tsc_data[scid].timer != -1 || tsc_data[cp_scid].timer != -1))
- break;
+ break;
if (dstsd && dstsd->unstripable_equip & equip)
break;
@@ -3824,8 +3822,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
for (i=0;i<MAX_INVENTORY;i++) {
if (dstsd->status.inventory[i].equip && (dstsd->status.inventory[i].equip & equip)){
pc_unequipitem(dstsd,i,3);
- if ((--strip_num) <= 0)
- break;
+ break;
}
}
if (i == MAX_INVENTORY)
@@ -3836,6 +3833,43 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
status_change_start(bl,scid,skilllv,0,0,0,strip_time,0 );
break;
}
+ case ST_FULLSTRIP: // Celest
+ {
+ struct status_change *tsc_data;
+ int i, j, strip_time, strip_per, strip_fix;
+ int equip[4] = { EQP_WEAPON, EQP_SHIELD, EQP_ARMOR, EQP_HELM };
+ int scid[4] = { SC_STRIPWEAPON, SC_STRIPSHIELD, SC_STRIPARMOR, SC_STRIPHELM };
+ int cp_scid[4] = { SC_CP_WEAPON, SC_CP_SHIELD, SC_CP_ARMOR, SC_CP_HELM };
+
+ tsc_data = status_get_sc_data(bl);
+ strip_fix = status_get_dex(src) - status_get_dex(bl);
+ if(strip_fix < 0)
+ strip_fix = 0;
+ strip_per = 5+2*skilllv+strip_fix/5;
+ if (rand()%100 >= strip_per)
+ break;
+ strip_time = skill_get_time(skillid,skilllv)+strip_fix/2;
+
+ for (i=0; i<4; i++) {
+ if (dstsd) {
+ if (tsc_data && (tsc_data[scid[i]].timer != -1 || tsc_data[cp_scid[i]].timer != -1))
+ continue;
+ if (dstsd->unstripable_equip & equip[i])
+ continue;
+ for (j=0; j<MAX_INVENTORY; j++) {
+ if (dstsd->status.inventory[j].equip && (dstsd->status.inventory[j].equip & equip[i])){
+ pc_unequipitem(dstsd,j,3);
+ break;
+ }
+ }
+ if (j == MAX_INVENTORY)
+ continue;
+ }
+ status_change_start(bl,scid[i],skilllv,0,0,0,strip_time,0 );
+ }
+ clif_skill_nodamage(src,bl,skillid,skilllv,1);
+ break;
+ }
/* PotionPitcher */
case AM_POTIONPITCHER: /* ポ?ションピッチャ? */