|
@@ -46,7 +46,7 @@ static const int packet_len_table[0x3d] = { // U - used, F - free
|
|
|
11,10,10, 0,11, -1,266,10, // 2b10-2b17: U->2b10, U->2b11, U->2b12, F->2b13, U->2b14, U->2b15, U->2b16, U->2b17
|
|
|
2,10, 2,-1,-1,-1, 2, 7, // 2b18-2b1f: U->2b18, U->2b19, U->2b1a, U->2b1b, U->2b1c, U->2b1d, U->2b1e, U->2b1f
|
|
|
-1,10, 8, 2, 2,14,19,19, // 2b20-2b27: U->2b20, U->2b21, U->2b22, U->2b23, U->2b24, U->2b25, U->2b26, U->2b27
|
|
|
- 10,10, 6, 0, 0, 0, 0, 0, // 2b28-2b2f: U->2b28, U->2b29, U->2b2a, F->2b2b, F->2b2c, F->2b2d, F->2b2e, F->2b2f
|
|
|
+ 10,10, 6, 0, 0, 6, -1, -1, // 2b28-2b2f: U->2b28, U->2b29, U->2b2a, F->2b2b, F->2b2c, U->2b2d, U->2b2e, U->2b2f
|
|
|
};
|
|
|
|
|
|
//Used Packets:
|
|
@@ -101,6 +101,11 @@ static const int packet_len_table[0x3d] = { // U - used, F - free
|
|
|
//2b28: Outgoing, chrif_save_bankdata -> 'send bank data to be saved'
|
|
|
//2b29: Incoming, chrif_load_bankdata -> 'received bank data for playeer to be loaded'
|
|
|
//2b2a: Outgoing, chrif_bankdata_request -> 'request bank data for charid'
|
|
|
+//2b2b: FREE
|
|
|
+//2b2c: FREE
|
|
|
+//2b2d: Outgoing, chrif_bsdata_request -> request bonus_script for pc_authok'ed char.
|
|
|
+//2b2e: Outgoing, chrif_save_bsdata -> Send bonus_script of player for saving.
|
|
|
+//2b2f: Incoming, chrif_load_bsdata -> received bonus_script of player for loading.
|
|
|
|
|
|
int chrif_connected = 0;
|
|
|
int char_fd = -1;
|
|
@@ -284,6 +289,7 @@ int chrif_save(struct map_session_data *sd, int flag) {
|
|
|
chrif_save_scdata(sd);
|
|
|
chrif_skillcooldown_save(sd);
|
|
|
chrif_save_bankdata(sd);
|
|
|
+ chrif_save_bsdata(sd);
|
|
|
}
|
|
|
if ( !chrif_auth_logout(sd,flag == 1 ? ST_LOGOUT : ST_MAPCHANGE) )
|
|
|
ShowError("chrif_save: Failed to set up player %d:%d for proper quitting!\n", sd->status.account_id, sd->status.char_id);
|
|
@@ -1568,7 +1574,7 @@ int chrif_parse(int fd) {
|
|
|
case 0x2b04: chrif_recvmap(fd); break;
|
|
|
case 0x2b06: chrif_changemapserverack(RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10), RFIFOL(fd,14), RFIFOW(fd,18), RFIFOW(fd,20), RFIFOW(fd,22), RFIFOL(fd,24), RFIFOW(fd,28)); break;
|
|
|
case 0x2b09: map_addnickdb(RFIFOL(fd,2), (char*)RFIFOP(fd,6)); break;
|
|
|
- case 0x2b0b: chrif_skillcooldown_load(fd); break;
|
|
|
+ case 0x2b0b: chrif_skillcooldown_load(fd); break;
|
|
|
case 0x2b0d: chrif_changedsex(fd); break;
|
|
|
case 0x2b0f: chrif_char_ask_name_answer(RFIFOL(fd,2), (char*)RFIFOP(fd,6), RFIFOW(fd,30), RFIFOW(fd,32)); break;
|
|
|
case 0x2b12: chrif_divorceack(RFIFOL(fd,2), RFIFOL(fd,6)); break;
|
|
@@ -1584,6 +1590,7 @@ int chrif_parse(int fd) {
|
|
|
case 0x2b25: chrif_deadopt(RFIFOL(fd,2), RFIFOL(fd,6), RFIFOL(fd,10)); break;
|
|
|
case 0x2b27: chrif_authfail(fd); break;
|
|
|
case 0x2b29: chrif_load_bankdata(fd); break;
|
|
|
+ case 0x2b2f: chrif_load_bsdata(fd); break;
|
|
|
default:
|
|
|
ShowError("chrif_parse : unknown packet (session #%d): 0x%x. Disconnecting.\n", fd, cmd);
|
|
|
set_eof(fd);
|
|
@@ -1705,6 +1712,110 @@ int chrif_send_report(char* buf, int len) {
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
+/** [Cydh]
|
|
|
+* Requets bonus_script datas
|
|
|
+* @param char_id
|
|
|
+*/
|
|
|
+int chrif_bsdata_request(int char_id) {
|
|
|
+ chrif_check(-1);
|
|
|
+ WFIFOHEAD(char_fd,6);
|
|
|
+ WFIFOW(char_fd,0) = 0x2b2d;
|
|
|
+ WFIFOL(char_fd,2) = char_id;
|
|
|
+ WFIFOSET(char_fd,6);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+/** [Cydh]
|
|
|
+* Stores bonus_script data(s) to the table
|
|
|
+* @param sd
|
|
|
+*/
|
|
|
+int chrif_save_bsdata(struct map_session_data *sd) {
|
|
|
+ int i, count=0;
|
|
|
+ unsigned int tick;
|
|
|
+ struct bonus_script_data bs;
|
|
|
+ const struct TimerData *timer;
|
|
|
+
|
|
|
+ chrif_check(-1);
|
|
|
+ tick = gettick();
|
|
|
+
|
|
|
+ WFIFOHEAD(char_fd,10+MAX_PC_BONUS_SCRIPT*sizeof(struct bonus_script_data));
|
|
|
+ WFIFOW(char_fd,0) = 0x2b2e;
|
|
|
+ WFIFOL(char_fd,4) = sd->status.char_id;
|
|
|
+
|
|
|
+ //Clear un-saved data
|
|
|
+ pc_bonus_script_check(sd,BONUS_FLAG_REM_ON_LOGOUT);
|
|
|
+
|
|
|
+ for (i = 0; i < MAX_PC_BONUS_SCRIPT; i++) {
|
|
|
+ if (!(&sd->bonus_script[i]) || !sd->bonus_script[i].script || strlen(sd->bonus_script[i].script_str) == 0)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ timer = get_timer(sd->bonus_script[i].tid);
|
|
|
+ if (timer == NULL || DIFF_TICK(timer->tick,tick) < 0)
|
|
|
+ continue;
|
|
|
+
|
|
|
+ memcpy(bs.script,sd->bonus_script[i].script_str,strlen(sd->bonus_script[i].script_str)+1);
|
|
|
+ bs.tick = DIFF_TICK(timer->tick,tick);
|
|
|
+ bs.flag = sd->bonus_script[i].flag;
|
|
|
+ bs.type = (sd->bonus_script[i].isBuff) ? 1 : 0;
|
|
|
+
|
|
|
+ memcpy(WFIFOP(char_fd,10+count*sizeof(struct bonus_script_data)),&bs,sizeof(struct bonus_script_data));
|
|
|
+ delete_timer(sd->bonus_script[i].tid,pc_bonus_script_timer);
|
|
|
+ count++;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (count == 0)
|
|
|
+ return 0;
|
|
|
+
|
|
|
+ WFIFOW(char_fd,8) = count;
|
|
|
+ WFIFOW(char_fd,2) = 10+count*sizeof(struct bonus_script_data);
|
|
|
+ WFIFOSET(char_fd,WFIFOW(char_fd,2));
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
+/** [Cydh]
|
|
|
+* Loads bonus_script datas
|
|
|
+* @param fd
|
|
|
+*/
|
|
|
+int chrif_load_bsdata(int fd) {
|
|
|
+ struct map_session_data *sd;
|
|
|
+ struct bonus_script_data *bs;
|
|
|
+ int cid, count;
|
|
|
+ uint8 i, count_ = 0;
|
|
|
+
|
|
|
+ cid = RFIFOL(fd,4);
|
|
|
+ sd = map_charid2sd(cid);
|
|
|
+
|
|
|
+ if (!sd) {
|
|
|
+ ShowError("chrif_load_bsdata: Player with CID %d not found!\n",cid);
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (sd->status.char_id != cid) {
|
|
|
+ ShowError("chrif_load_bsdata: Receiving data for char id does not matches (%d != %d)!\n",sd->status.char_id,cid);
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ count = RFIFOW(fd,8);
|
|
|
+
|
|
|
+ for (i = 0; i < count; i++) {
|
|
|
+ struct script_code *script;
|
|
|
+ bs = (struct bonus_script_data*)RFIFOP(fd,10 + i*sizeof(struct bonus_script_data));
|
|
|
+
|
|
|
+ if (!(script = parse_script(bs->script,"chrif_load_bsdata",1,1)))
|
|
|
+ continue;
|
|
|
+
|
|
|
+ memcpy(sd->bonus_script[i].script_str,bs->script,strlen(bs->script));
|
|
|
+ sd->bonus_script[i].script = script;
|
|
|
+ sd->bonus_script[i].tick = gettick() + bs->tick;
|
|
|
+ sd->bonus_script[i].flag = (uint8)bs->flag;
|
|
|
+ sd->bonus_script[i].isBuff = (bs->type) ? true : false;
|
|
|
+ count_++;
|
|
|
+ }
|
|
|
+ if (count_)
|
|
|
+ status_calc_pc(sd,false);
|
|
|
+ return 0;
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* @see DBApply
|
|
|
*/
|