Explorar o código

* Fixed change cart packet doesn't check for skill.
* Added new packets for Plagiarism.

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

Inkfish %!s(int64=15) %!d(string=hai) anos
pai
achega
9622957e11
Modificáronse 7 ficheiros con 74 adicións e 8 borrados
  1. 3 0
      Changelog-Trunk.txt
  2. 1 1
      src/map/atcommand.c
  3. 2 2
      src/map/chrif.c
  4. 56 1
      src/map/clif.c
  5. 2 0
      src/map/clif.h
  6. 5 1
      src/map/pc.c
  7. 5 3
      src/map/skill.c

+ 3 - 0
Changelog-Trunk.txt

@@ -3,6 +3,9 @@ Date	Added
 AS OF SVN REV. 5091, WE ARE NOW USING TRUNK.  ALL UNTESTED BUGFIXES/FEATURES GO INTO TRUNK.
 IF YOU HAVE A WORKING AND TESTED BUGFIX PUT IT INTO STABLE AS WELL AS TRUNK.
 
+2010/01/14
+	* Fixed change cart packet doesn't check for skill. [Inkfish]
+	* Added new packets for Plagiarism. [Inkfish]
 2009/12/27
 	* Fixed Meteor Assault and Spread Attack have twice the chance to trigger AutoSpellOnSkill. [Inkfish]
 2009/12/03

+ 1 - 1
src/map/atcommand.c

@@ -3705,7 +3705,7 @@ int atcommand_lostskill(const int fd, struct map_session_data* sd, const char* c
 
 	sd->status.skill[skill_id].lv = 0;
 	sd->status.skill[skill_id].flag = 0;
-	clif_skillinfoblock(sd);
+	clif_deleteskill(sd,skill_id);
 	clif_displaymessage(fd, msg_txt(71)); // You have forgotten the skill.
 
 	return 0;

+ 2 - 2
src/map/chrif.c

@@ -928,7 +928,7 @@ int chrif_deadopt(int father_id, int mother_id, int child_id)
 		sd->status.skill[WE_CALLBABY].id = 0;
 		sd->status.skill[WE_CALLBABY].lv = 0;
 		sd->status.skill[WE_CALLBABY].flag = 0;
-		clif_skillinfoblock(sd);
+		clif_deleteskill(sd,WE_CALLBABY);
 	}
 
 	if( mother_id && (sd = map_charid2sd(mother_id)) != NULL && sd->status.child == child_id )
@@ -937,7 +937,7 @@ int chrif_deadopt(int father_id, int mother_id, int child_id)
 		sd->status.skill[WE_CALLBABY].id = 0;
 		sd->status.skill[WE_CALLBABY].lv = 0;
 		sd->status.skill[WE_CALLBABY].flag = 0;
-		clif_skillinfoblock(sd);
+		clif_deleteskill(sd,WE_CALLBABY);
 	}
 
 	return 0;

+ 56 - 1
src/map/clif.c

@@ -4103,6 +4103,58 @@ int clif_skillinfoblock(struct map_session_data *sd)
 	return 1;
 }
 
+int clif_addskill(struct map_session_data *sd, int id )
+{
+	int fd;
+
+	nullpo_retr(0, sd);
+
+	fd = sd->fd;
+	if (!fd) return 0;
+
+	if( sd->status.skill[id].id <= 0 )
+		return 0;
+
+	WFIFOHEAD(fd, packet_len(0x111));
+	WFIFOW(fd,0) = 0x111;
+	WFIFOW(fd,2) = id;
+	WFIFOW(fd,4) = sd->status.skill[id].lv;
+	WFIFOW(fd,6) = 0;
+	if( (id == MO_EXTREMITYFIST && sd->state.combo&1) || (id == TK_JUMPKICK && sd->state.combo&2) )
+		WFIFOW(fd,8) = INF_SELF_SKILL;
+	else
+		WFIFOW(fd,8) = skill_get_inf(id);
+    WFIFOW(fd,10) = skill_get_sp(id,sd->status.skill[id].lv);
+    WFIFOW(fd,12)= skill_get_range2(&sd->bl, id,sd->status.skill[id].lv);
+    safestrncpy((char*)WFIFOP(fd,14), skill_get_name(id), NAME_LENGTH);
+    if( sd->status.skill[id].flag == 0 )
+        WFIFOB(fd,38) = (sd->status.skill[id].lv < skill_tree_get_max(id, sd->status.class_))? 1:0;
+    else
+        WFIFOB(fd,38) = 0;
+    WFIFOSET(fd,packet_len(0x111));
+
+    return 1;
+}
+
+int clif_deleteskill(struct map_session_data *sd, int id)
+{
+#if PACKETVER >= 20081217
+	int fd;
+
+	nullpo_retr(0, sd);
+	fd = sd->fd;
+	if( !fd ) return 0;
+
+	WFIFOHEAD(fd,packet_len(0x441));
+	WFIFOW(fd,0) = 0x441;
+	WFIFOW(fd,2) = id;
+	WFIFOSET(fd,packet_len(0x441));
+	return 1;
+#else
+	return clif_skillinfoblock(sd);
+#endif
+}
+
 /*==========================================
  * ƒXƒLƒ‹Š„‚è�U‚è’Ê’m
  *------------------------------------------*/
@@ -9509,6 +9561,9 @@ void clif_parse_ChangeCart(int fd,struct map_session_data *sd)
 {
 	int type;
 
+	if( sd && pc_checkskill(sd, MC_CHANGECART) < 1 )
+		return;
+
 	type = (int)RFIFOW(fd,2);
 
 	if( (type == 5 && sd->status.base_level > 90) ||
@@ -13691,7 +13746,7 @@ static int packetdb_readdb(void)
 	    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
 	    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0, 25,
 	//#0x0440
-	    0,  0,  0,  0,  0,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
+	    0,  4,  0,  0,  0,  0, 14,  0,  0,  0,  0,  0,  0,  0,  0,  0,
 	    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
 	    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,
 	    0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,

+ 2 - 0
src/map/clif.h

@@ -192,6 +192,8 @@ int clif_mob_equip(struct mob_data *md,int nameid); // [Valaris]
 int clif_skillinfo(struct map_session_data *sd,int skillid,int type,int range);
 int clif_skillinfoblock(struct map_session_data *sd);
 int clif_skillup(struct map_session_data *sd,int skill_num);
+int clif_addskill(struct map_session_data *sd, int skill);
+int clif_deleteskill(struct map_session_data *sd, int skill);
 
 int clif_skillcasting(struct block_list* bl,int src_id,int dst_id,int dst_x,int dst_y,int skill_num,int pl,int casttime);
 int clif_skillcastcancel(struct block_list* bl);

+ 5 - 1
src/map/pc.c

@@ -2961,10 +2961,14 @@ int pc_skill(TBL_PC* sd, int id, int level, int flag)
 		sd->status.skill[id].lv   = level;
 		sd->status.skill[id].flag = 0;
 		if( !level ) //Remove skill.
+		{
 			sd->status.skill[id].id = 0;
+			clif_deleteskill(sd,id);
+		}
+		else
+			clif_addskill(sd,id);
 		if( !skill_get_inf(id) ) //Only recalculate for passive skills.
 			status_calc_pc(sd, 0);
-		clif_skillinfoblock(sd);
 	break;
 	case 2: //Add skill bonus on top of what you had.
 		if( sd->status.skill[id].id == id ){

+ 5 - 3
src/map/skill.c

@@ -1864,18 +1864,20 @@ int skill_attack (int attack_type, struct block_list* src, struct block_list *ds
 				tsd->status.skill[tsd->cloneskill_id].id = 0;
 				tsd->status.skill[tsd->cloneskill_id].lv = 0;
 				tsd->status.skill[tsd->cloneskill_id].flag = 0;
+				clif_deleteskill(tsd,tsd->cloneskill_id);
 			}
 
 			if ((type = pc_checkskill(tsd,RG_PLAGIARISM)) < lv)
 				lv = type;
 
 			tsd->cloneskill_id = skillid;
+			pc_setglobalreg(tsd, "CLONE_SKILL", skillid);
+			pc_setglobalreg(tsd, "CLONE_SKILL_LV", lv);
+
 			tsd->status.skill[skillid].id = skillid;
 			tsd->status.skill[skillid].lv = lv;
 			tsd->status.skill[skillid].flag = 13;//cloneskill flag
-			pc_setglobalreg(tsd, "CLONE_SKILL", skillid);
-			pc_setglobalreg(tsd, "CLONE_SKILL_LV", lv);
-			clif_skillinfoblock(tsd);
+			clif_addskill(tsd,skillid);
 		}
 	}
 	if( skillid != WZ_SIGHTRASHER &&