Explorar o código

Finished Full Strip, Weapon Refine, Slim Pitcher and Full Protection

git-svn-id: https://svn.code.sf.net/p/rathena/svn/athena@369 54d463be-8e91-2dee-dedb-b68131a5f0ec
celest %!s(int64=20) %!d(string=hai) anos
pai
achega
af56e64377
Modificáronse 14 ficheiros con 205 adicións e 75 borrados
  1. 3 0
      Changelog.txt
  2. 2 1
      Dev/bugs.txt
  3. 4 0
      db/skill_cast_db.txt
  4. 8 6
      db/skill_db.txt
  5. 6 0
      db/skill_require_db.txt
  6. 6 0
      db/skill_tree.txt
  7. 0 10
      src/map/battle.c
  8. 27 0
      src/map/clif.c
  9. 1 0
      src/map/clif.h
  10. 0 6
      src/map/guild.c
  11. 79 20
      src/map/pc.c
  12. 1 0
      src/map/pc.h
  13. 64 28
      src/map/skill.c
  14. 4 4
      src/map/skill.h

+ 3 - 0
Changelog.txt

@@ -1,4 +1,7 @@
 Date	Added
+11/26   
+        * Finished Full Strip, Weapon Refine, Slim Pitcher and Full Protection. [celest]
+
 11/25
 	* Added @skilltree to help GM's answer skill tree questions [MouseJstr]
 	* Update Spider Web; I believe you cannot use it on yourself now. [Codemaster]

+ 2 - 1
Dev/bugs.txt

@@ -81,7 +81,8 @@ Progess:	0%
 
 Problem:	@job/#job turns you into 2-2-1 and not into any other jobs
 Assigned:	N/a
-Progess:	0%
+Progess:	0% (Notes by Celest: Actually, check here ^_- 
+http://eathena.deltaanime.net/forum/viewtopic.php?p=79951#79951)
 
 Problem:	@disguise has no death sprite so the client crashes when you die, a solution would be that upon death before the sprites change you're undisguised.
 Assigned:	N/a

+ 4 - 0
db/skill_cast_db.txt

@@ -268,6 +268,10 @@
 406,0,0,0,3000	//ASC_METEORASSAULT#ƒ�ƒeƒIƒAƒTƒ‹ƒg#
 407,0,5000,0,0	//ASC_CDP
 
+475,0,0,300000,0	//ST_PRESERVE##
+476,1000,1000,75000:90000:105000:120000:135000,0	//ST_FULLSTRIP##
+479,2000,0,60000:120000:180000:240000:300000,0	//CR_FULLPROTECTION##
+
 10010,100,60000,0	//GD_BATTLEORDER##
 10011,100,60000,0	//GD_REGENERATION##
 10012,100,0,0	//GD_RESTORE##

+ 8 - 6
db/skill_db.txt

@@ -508,6 +508,12 @@
 471,0,0,0,0,0,0,0,no,0,0,0,none,0	//SL_SKE##
 472,0,0,0,0,0,0,0,no,0,0,0,none,0	//SL_SKA##
 
+475,0,0,4,0,1,1,1,yes,0,0,0,magic,0	//ST_PRESERVE##
+476,1,6,1,0,1,5,1,yes,0,0,0,weapon,0	//ST_FULLSTRIP##
+477,0,6,4,0,1,10,1,no,0,0,0,weapon,0	//WS_WEAPONREFINE##
+478,3,6,2,0,1,10,1,no,0,0,0,none,0	//CR_SLIMPITCHER##
+479,1,6,16,0,1,5,1,yes,0,0,0,weapon,0	//CR_FULLPROTECTION##
+
 //id,range,hit,inf,pl,nk,max,list_num,castcancel,cast_defence_rate,inf2,maxcount,skill_type,blow_count
 10000,0,0,0,0,0,1,0,no,0,0,0,none,0	//GD_APPROVAL#惓婯僊儖僪彸擣#
 10001,0,0,0,0,0,1,0,no,0,0,0,none,0	//GD_KAFRACONTRACT#僇僾儔屬梡#
@@ -525,9 +531,5 @@
 10013,0,0,4,0,1,1,0,no,0,0,0,none,0	//GD_EMERGENCYCALL##
 10014,0,0,0,0,0,1,0,no,0,0,0,none,0	//GD_DEVELOPMENT##
 
-// ST_PRESERVE#橇府历宏#
-// ST_FULLSTRIP#钱_胶飘赋#
-// WS_WEAPONREFINE#公扁力访#
-// CR_SLIMPITCHER#浇覆_乔媚#
-// CR_FULLPROTECTION#钱_纳固漠橇肺咆记#
-// ITM_TOMAHAWK#配付龋农_带瘤扁#
+
+// ITM_TOMAHAWK#配付龋农_带瘤扁# 337

+ 6 - 0
db/skill_require_db.txt

@@ -291,6 +291,12 @@
 //407,0,0,50,0,0,0,99,none,0,937,1,952,1,939,1,7033,1,972,1,657,1,713,1,0,0,0,0,0,0	//ASC_CDP
 407,0,0,50,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//ASC_CDP#ƒfƒbƒhƒŠ?ƒ|ƒCƒYƒ“�ì�¬#
 
+475,0,0,40,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//ST_PRESERVE##
+476,0,0,12:14:16:18:20,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//ST_FULLSTRIP##
+477,0,0,5,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//WS_WEAPONREFINE##
+478,0,0,30,0,0,0,99,none,0,545,1,545,1,545,1,545,1,545,1,546,1,546,1,546,1,546,1,547,1	//CR_SLIMPITCHER##
+479,0,0,30,0,0,0,99,none,0,7139,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//CR_FULLPROTECTION##
+
 10010,0,0,1,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//GD_BATTLEORDER##
 10011,0,0,1,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//GD_REGENERATION##
 10012,0,0,1,0,0,0,99,none,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0	//GD_RESTORE##

+ 6 - 0
db/skill_tree.txt

@@ -837,6 +837,7 @@
 4011,386,3,97,3,106,1,107,5,0,0,0,0//WS_CREATENUGGET		#基本スキル#
 4011,387,1,39,5,153,1,154,1,105,1,0,0//WS_CARTBOOST		#基本スキル#
 4011,388,1,107,10,112,3,0,0,0,0,0,0//WS_SYSTEMCREATE		#基本スキル#
+4011,477,10,109,5,94,5,96,3,97,2,0,0//WS_WEAPONREFINE
 //Sniper
 4012,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC		#基本スキル#
 4012,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID	#応急手当#
@@ -1080,6 +1081,8 @@
 4018,389,5,51,5,213,3,0,0,0,0,0,0//ST_CHASEWALK
 4018,390,5,215,1,0,0,0,0,0,0,0,0//ST_REJECTSWORD
 4018,391,5,215,1,0,0,0,0,0,0,0,0//ST_STEALBACKPACK
+4018,475,1,219,5,225,1,0,0,0,0,0,0//ST_PRESERVE
+4018,476,5,215,1,216,1,217,1,218,1,0,0//ST_FULLSTRIP
 //Creator
 4019,1,9,0,0,0,0,0,0,0,0,0,0//NV_BASIC		#基本スキル#
 4019,142,1,0,0,0,0,0,0,0,0,0,0//NV_FIRSTAID	#応急手当#
@@ -1106,6 +1109,9 @@
 4019,235,5,237,3,0,0,0,0,0,0,0,0//AM_CP_SHIELD	#ケミカルシールドチャージ#
 4019,236,5,235,3,0,0,0,0,0,0,0,0//AM_CP_ARMOR	#ケミカルアーマーチャージ#
 4019,237,5,228,2,0,0,0,0,0,0,0,0//AM_CP_HELM	#ケミカルヘルムチャージ#
+4019,478,10,228,3,0,0,0,0,0,0,0,0//CR_SLIMPITCHER
+4019,479,5,234,1,235,1,236,1,237,1,0,0//CR_FULLPROTECTION
+
 // 韓国でも未実装なので以下のツリーコメントアウト
 //4019,238,1,0,0,0,0,0,0,0,0,0,0//AM_BIOETHICS		#生命倫理#
 //4019,239,10,238,1,0,0,0,0,0,0,0,0//AM_BIOTECHNOLOGY	#生命工学研究#

+ 0 - 10
src/map/battle.c

@@ -3562,21 +3562,13 @@ static struct Damage battle_calc_pc_weapon_attack(
 	}
 
 	// 状態異常中のダメージ追加でクリティカルにも有効なスキル
-
 	if (sc_data) {
-
 		// エンチャントデッドリーポイズン
-
 		if(sc_data[SC_EDP].timer != -1) {
-
 			damage += damage * (150 + sc_data[SC_EDP].val1 * 50) / 100;
-
 			damage2 += damage2 * (150 + sc_data[SC_EDP].val1 * 50) / 100;
-
 			no_cardfix = 1;
-
 		}
-
 	}
 
 	// 精錬ダメージの追加
@@ -4500,9 +4492,7 @@ int battle_weapon_attack( struct block_list *src,struct block_list *target,
 	}
 
 	if(battle_check_target(src,target,BCT_ENEMY) <= 0 &&
-
 				!battle_check_range(src,target,0))
-
 		return 0;	// 攻撃対象外
 
 	race = battle_get_race(target);

+ 27 - 0
src/map/clif.c

@@ -5030,6 +5030,33 @@ int clif_item_repair_list(struct map_session_data *sd)
 	return 0;
 }
 
+/*==========================================
+ * Weapon Refining [Celest]
+ *------------------------------------------
+ */
+int clif_item_refine_list(struct map_session_data *sd)
+{
+	int i,c;
+	int fd;
+
+	nullpo_retr(0, sd);
+
+	fd=sd->fd;
+
+	WFIFOW(fd,0)=0x177; // temporarily use same packet as clif_item_identify
+	for(i=c=0;i<MAX_INVENTORY;i++){
+		if(sd->status.inventory[i].nameid > 0 && itemdb_type(sd->status.inventory[i].nameid)==4){
+			WFIFOW(fd,c*2+4)=i+2;
+			c++;
+		}
+	}
+	if(c > 0) {
+		WFIFOW(fd,2)=c*2+4;
+		WFIFOSET(fd,WFIFOW(fd,2));
+	}
+	return 0;
+}
+
 /*==========================================
  * アイテムによる一時的なスキル効果
  *------------------------------------------

+ 1 - 0
src/map/clif.h

@@ -188,6 +188,7 @@ int clif_cart_equiplist(struct map_session_data *sd);
 int clif_item_identify_list(struct map_session_data *sd);
 int clif_item_identified(struct map_session_data *sd,int idx,int flag);
 int clif_item_repair_list(struct map_session_data *sd);
+int clif_item_refine_list(struct map_session_data *sd);
 
 int clif_item_skill(struct map_session_data *sd,int skillid,int skilllv,const char *name);
 

+ 0 - 6
src/map/guild.c

@@ -62,16 +62,10 @@ int guild_skill_get_max(int id) { // Modified for new skills [Sara]
 // ギルドスキルがあるか確認
 int guild_checkskill(struct guild *g,int id)
 {
-
 	int idx = id-GD_SKILLBASE;
-
-
 	if (idx < 0 || idx >= MAX_GUILDSKILL)
-
 		return 0;
-
 	return g->skill[idx].lv;
-
 }
 
 

+ 79 - 20
src/map/pc.c

@@ -1,4 +1,4 @@
-// $Id: pc.c 101 2004-11-25 4:02:51 PM Celestia $
+// $Id: pc.c 101 2004-11-26 5:47:29 PM Celestia $
 #include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
@@ -2733,23 +2733,14 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
 		}
 		break;
 	case SP_HP_DRAIN_VALUE:
-
 		if(!sd->state.lr_flag) {
-
 			sd->hp_drain_rate += type2;
-
 			sd->hp_drain_value += val;
-
 		}
-
 		else if(sd->state.lr_flag == 1) {
-
 			sd->hp_drain_rate_ += type2;
-
 			sd->hp_drain_value_ += val;
-
 		}
-
 		break;
 	case SP_SP_DRAIN_RATE:
 		if(!sd->state.lr_flag) {
@@ -2762,21 +2753,13 @@ int pc_bonus2(struct map_session_data *sd,int type,int type2,int val)
 		}
 		break;
 	case SP_SP_DRAIN_VALUE:
-
 		if(!sd->state.lr_flag) {
-
 			sd->sp_drain_rate += type2;
-
 			sd->sp_drain_value += val;
-
 		}
-
 		else if(sd->state.lr_flag == 1) {
-
 			sd->sp_drain_rate_ += type2;
-
 			sd->sp_drain_value_ += val;
-
 		}
 
 		break;
@@ -3448,9 +3431,10 @@ int pc_item_identify(struct map_session_data *sd,int idx)
 	nullpo_retr(0, sd);
 
 	// Celest
-	if (sd->skillid == BS_REPAIRWEAPON) {
+	if (sd->skillid == BS_REPAIRWEAPON)
 		return pc_item_repair (sd, idx);
-	}
+	else if (sd->skillid == WS_WEAPONREFINE)
+		return pc_item_refine (sd, idx);
 
 	if(idx >= 0 && idx < MAX_INVENTORY) {
 		if(sd->status.inventory[idx].nameid > 0 && sd->status.inventory[idx].identify == 0 ){
@@ -3491,6 +3475,81 @@ int pc_item_repair(struct map_session_data *sd,int idx)
 	return !flag;
 }
 
+/*==========================================
+ * Weapon Refining [Celest]
+ *------------------------------------------
+ */
+int pc_item_refine(struct map_session_data *sd,int idx)
+{
+	int flag = 1, i = 0, count = 0, ep = 0, per, refine;
+	int material[5] = { 0, 1010, 1011, 984, 984 };
+	
+	nullpo_retr(0, sd);
+	struct item *item = &sd->status.inventory[idx];
+
+	if(idx >= 0 && idx < MAX_INVENTORY) {
+		if(item->nameid > 0 && itemdb_type(item->nameid)==4) {
+			// if it's no longer refineable
+			if (item->refine == 10) {
+				clif_skill_fail(sd,sd->skillid,0,0);
+				return 0;
+			}
+			refine = item->refine + sd->skilllv > 10
+				? 10 - item->refine : sd->skilllv;
+			for (i=0; i < MAX_INVENTORY; i++)
+				if(sd->status.inventory[i].nameid == material [itemdb_wlv (item->nameid)])
+					count += sd->status.inventory[i].amount;
+			if (count < refine ) {
+				clif_skill_fail(sd,sd->skillid,0,0);
+				return 0;
+			}
+			per = percentrefinery [itemdb_wlv (item->nameid)][item->refine + refine - 1];
+			//per += pc_checkskill(sd,BS_WEAPONRESEARCH);
+			per *= (75 + sd->status.job_level/2)/100;
+			
+			if (per > rand() % 100) {
+				flag = 0;
+				item->refine += refine;
+
+				for (i=0; i < MAX_INVENTORY; i++)
+					if(sd->status.inventory[i].nameid == material [itemdb_wlv (item->nameid)]) {
+						if (sd->status.inventory[i].amount >= refine) {
+							pc_delitem(sd,i,refine,0);
+							break;
+						} else {
+							refine -= sd->status.inventory[i].amount;
+							pc_delitem(sd,i,sd->status.inventory[i].amount,0);
+						}
+					}
+
+				if(item->equip) {
+					ep = item->equip;
+					pc_unequipitem(sd,idx,0, BF_NORMAL);
+				}
+				clif_refine(sd->fd,sd,0,idx,item->refine);
+				clif_delitem(sd,idx,1);				
+				clif_additem(sd,idx,1,0);
+				if (ep)
+					pc_equipitem(sd,idx,ep);
+				clif_misceffect(&sd->bl,3);
+			}
+			else {
+				clif_delitem(sd,i,refine);
+				item->refine = 0;
+				if(item->equip)
+					pc_unequipitem(sd,idx,0, BF_NORMAL);
+				clif_refine(sd->fd,sd,1,idx,item->refine);
+				pc_delitem(sd,idx,1,0);
+				clif_misceffect(&sd->bl,2);
+
+				clif_emotion(&sd->bl, 23);
+			}
+		}
+	}
+
+	return !flag;
+}
+
 /*==========================================
  * ƒXƒeƒBƒ‹•iŒöŠJ
  *------------------------------------------

+ 1 - 0
src/map/pc.h

@@ -89,6 +89,7 @@ int pc_insert_card(struct map_session_data *sd,int idx_card,int idx_equip);
 
 int pc_item_identify(struct map_session_data *sd,int idx);
 int pc_item_repair(struct map_session_data *sd,int idx); // [Celest]
+int pc_item_refine(struct map_session_data *sd,int idx); // [Celest]
 int pc_steal_item(struct map_session_data *sd,struct block_list *bl);
 int pc_steal_coin(struct map_session_data *sd,struct block_list *bl);
 

+ 64 - 28
src/map/skill.c

@@ -1,4 +1,4 @@
-// $Id: skill.c,v 1.8 2004/11/25 4:02:35 PM Celestia Exp $
+// $Id: skill.c,v 1.8 2004/11/26 5:46:59 PM Celestia Exp $
 /* ƒXƒLƒ‹?ŒW */
 
 #include <stdio.h>
@@ -3718,7 +3718,7 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
 				map_freeblock_unlock();
 				return 1;
 			}
-			clif_item_repair_list(sd);			
+			clif_item_repair_list(sd);
 		}
 		break;
 
@@ -3876,22 +3876,38 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
 		}
 		break;
 
+	// Full Strip [Celest]
 	case ST_FULLSTRIP:
 		{
 			struct status_change *tsc_data = battle_get_sc_data(bl);
-			
-			if(tsc_data && tsc_data[SC_CP_HELM].timer != -1)
-				break;
+			int c=0, i, j;
+			int striplist[2][4] = { { 0, 0, 0, 0 },
+				{ 0x0002, 0x0020, 0x0010, 0x0100 } };
+
 			strip_per = 5+2*skilllv+strip_fix/5;
 			strip_time = skill_get_time(skillid,skilllv)+strip_fix/2;
-			if(rand()%100 < strip_per){
+			for (i=0; i<4; i++) {
+				if(tsc_data && tsc_data[SC_CP_WEAPON + i].timer != -1)
+					break;
+				if(rand()%100 < strip_per) {
+					striplist[0][i] = 1;
+					c++;
+				}
+			}
+
+			if (c > 0) {
 				clif_skill_nodamage(src,bl,skillid,skilllv,1);
-				skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,strip_time,0 );
-				if(dstsd){
-					for(i=0;i<MAX_INVENTORY;i++){
-						if(dstsd->status.inventory[i].equip && dstsd->status.inventory[i].equip & 0x0100){
-							pc_unequipitem(dstsd,i,0,BF_SKILL);
-							break;
+				for (j=0; j<4 && c > 0; j++) {
+					if (striplist[0][j]) {
+						skill_status_change_start(bl,SC_STRIPWEAPON + i,skilllv,0,0,0,strip_time,0 );
+						if(dstsd){
+							for(i=0;i<MAX_INVENTORY;i++){
+								if(dstsd->status.inventory[i].equip && dstsd->status.inventory[i].equip & striplist[1][j]){
+									pc_unequipitem(dstsd,i,0,BF_SKILL);
+									--c;
+									break;
+								}
+							}
 						}
 					}
 				}
@@ -3972,46 +3988,46 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
 	case AM_CP_WEAPON:
 		{
 			struct status_change *tsc_data = battle_get_sc_data(bl);
-		clif_skill_nodamage(src,bl,skillid,skilllv,1);
+			clif_skill_nodamage(src,bl,skillid,skilllv,1);
 			if(tsc_data && tsc_data[SC_STRIPWEAPON].timer != -1)
-			skill_status_change_end(bl, SC_STRIPWEAPON, -1 );
-		skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
+				skill_status_change_end(bl, SC_STRIPWEAPON, -1 );
+			skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
 		}
 		break;
 	case AM_CP_SHIELD:
 		{
 			struct status_change *tsc_data = battle_get_sc_data(bl);
-		clif_skill_nodamage(src,bl,skillid,skilllv,1);
+			clif_skill_nodamage(src,bl,skillid,skilllv,1);
 			if(tsc_data && tsc_data[SC_STRIPSHIELD].timer != -1)
-			skill_status_change_end(bl, SC_STRIPSHIELD, -1 );
-		skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
+				skill_status_change_end(bl, SC_STRIPSHIELD, -1 );
+			skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
 		}
 		break;
 	case AM_CP_ARMOR:
 		{
 			struct status_change *tsc_data = battle_get_sc_data(bl);
-		clif_skill_nodamage(src,bl,skillid,skilllv,1);
+			clif_skill_nodamage(src,bl,skillid,skilllv,1);
 			if(tsc_data && tsc_data[SC_STRIPARMOR].timer != -1)
-			skill_status_change_end(bl, SC_STRIPARMOR, -1 );
-		skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
+				skill_status_change_end(bl, SC_STRIPARMOR, -1 );
+			skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
 		}
 		break;
 	case AM_CP_HELM:
 		{
 			struct status_change *tsc_data = battle_get_sc_data(bl);
-		clif_skill_nodamage(src,bl,skillid,skilllv,1);
+			clif_skill_nodamage(src,bl,skillid,skilllv,1);
 			if(tsc_data && tsc_data[SC_STRIPHELM].timer != -1)
-			skill_status_change_end(bl, SC_STRIPHELM, -1 );
-		skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
+				skill_status_change_end(bl, SC_STRIPHELM, -1 );
+			skill_status_change_start(bl,SkillStatusChangeTable[skillid],skilllv,0,0,0,skill_get_time(skillid,skilllv),0 );
 		}
 		break;
 
 	case SA_DISPELL:			/* ƒfƒBƒXƒyƒ‹ */
 		{
 			int i;
-		clif_skill_nodamage(src,bl,skillid,skilllv,1);
-		if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
-			break;
+			clif_skill_nodamage(src,bl,skillid,skilllv,1);
+			if( bl->type==BL_PC && ((struct map_session_data *)bl)->special_state.no_magic_damage )
+				break;
 			for(i=0;i<136;i++){
 				if(i==SC_RIDING || i== SC_FALCON || i==SC_HALLUCINATION || i==SC_WEIGHT50
 					|| i==SC_WEIGHT90 || i==SC_STRIPWEAPON || i==SC_STRIPSHIELD || i==SC_STRIPARMOR
@@ -4421,7 +4437,13 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
 		}
 		break;
 
-	// Slim Pitcher [Celest]
+	// Weapon Refining [Celest]
+	case WS_WEAPONREFINE:
+		if(sd)
+			clif_item_refine_list(sd);
+		break;
+
+	// Slim Pitcher
 	case CR_SLIMPITCHER:
 		{
 			if (sd && flag&1) {
@@ -4434,6 +4456,20 @@ int skill_castend_nodamage_id( struct block_list *src, struct block_list *bl,int
 			}
 		}
 		break;
+	// Full Chemical Protection
+	case CR_FULLPROTECTION:
+		{
+			int i, skilltime;
+			struct status_change *tsc_data = battle_get_sc_data(bl);
+			clif_skill_nodamage(src,bl,skillid,skilllv,1);
+			skilltime = skill_get_time(skillid,skilllv);
+			for (i=0; i<4; i++) {
+				if(tsc_data && tsc_data[SC_STRIPWEAPON + i].timer != -1)
+					skill_status_change_end(bl, SC_STRIPWEAPON + i, -1 );
+				skill_status_change_start(bl,SC_CP_WEAPON + i,skilllv,0,0,0,skilltime,0 );
+			}
+		}
+		break;
 
 	case RG_CLEANER:	//AppleGirl
 		clif_skill_nodamage(src,bl,skillid,skilllv,1);

+ 4 - 4
src/map/skill.h

@@ -1,4 +1,4 @@
-// $Id: skill.h,v 1.5 2004/09/25 05:32:19 MouseJstr Exp $
+// $Id: skill.h,v 1.5 2004/11/26 5:47:12 PM Celestia Exp $
 #ifndef _SKILL_H_
 #define _SKILL_H_
 
@@ -734,6 +734,7 @@ enum {
 	WE_CALLPARTNER,
 
 	NPC_SELFDESTRUCTION2 = 331,
+	ITM_TOMAHAWK = 337,
 	NPC_DARKCROSS = 338,
 
 	LK_AURABLADE = 355,
@@ -855,13 +856,12 @@ enum {
 	SL_SKE,
 	SL_SKA,
 	
-	// Will assign skill id's later [Celest]
-	ST_PRESERVE,
+	ST_PRESERVE = 475,
 	ST_FULLSTRIP,
 	WS_WEAPONREFINE,
 	CR_SLIMPITCHER,
 	CR_FULLPROTECTION,
-	ITM_TOMAHAWK,
+	
 
 //	moved to common/mmo.h
 /*	GD_APPROVAL=10000,