Просмотр исходного кода

added setiteminfo function, updated setitemscript func, added NPC sample for them

git-svn-id: https://svn.code.sf.net/p/rathena/svn/trunk@9938 54d463be-8e91-2dee-dedb-b68131a5f0ec
Lupus 18 лет назад
Родитель
Сommit
7beec2d152
5 измененных файлов с 146 добавлено и 8 удалено
  1. 7 0
      Changelog-Trunk.txt
  2. 1 0
      npc/Changelog.txt
  3. 70 0
      npc/sample/npc_test_setitemx.txt
  4. 1 1
      src/map/itemdb.h
  5. 67 7
      src/map/script.c

+ 7 - 0
Changelog-Trunk.txt

@@ -3,6 +3,13 @@ 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.
 
+2007/03/02
+	* Added new script function: setiteminfo. Now you can make custom items [Lupus]
+	- Updated script function setitemscript(itemID,script,WhichScript)
+		now u can set one of 3 item scripts: use/update, equip, unequip
+		But it works only if the original item had 3 non empty scriptsin ITEM_DB
+		can't fix this issue yet
+	- Check npc/sample/npc_test_setitemx.txt as example of setiteminfo & setitemscript
 2007/03/01
 	* Fixed the definition of warpwaitingpc so that it allows an optional
 	  argument (number of people to warp).

+ 1 - 0
npc/Changelog.txt

@@ -28,6 +28,7 @@ Date		Added
 ======
 2007/03/01
 	* The Sign: Fixed possible exploit, thanks to happylight [Lupus]
+	- Added npc/sample/npc_test_setitemx.txt
 2007/02/28
 	* Fixes to Merchant/Smith skill quests according to ragnainfo wiki [DracoRPG]
 	- Added missing 1 Banana Juice requirement to Cart Revolution quest

+ 70 - 0
npc/sample/npc_test_setitemx.txt

@@ -0,0 +1,70 @@
+//by Lupus.
+// SVN TRUNK 9940+ only
+
+//setiteminfo(itemID,n,Value), where n
+//		0 value_buy;
+//		1 value_sell;
+//		2 type;
+//		3 maxchance = Max drop chance of this item e.g. 1 = 0.01% , etc..
+//				if = 0, then monsters don't drop it at all (rare or a quest item)
+//				if = 10000, then this item is sold in NPC shops only
+//		4 sex;
+//		5 equip;
+//		6 weight;
+//		7 atk;
+//		8 def;
+//		9 range;
+//		10 slot;
+//		11 look;
+//		12 elv;
+//		13 wlv;
+
+prontera.gat,164,161,5	script	Lupus	1013,{
+	menu "Make Knife[3] Edible",M_1,
+		"Make Apple Equippable",M_2,
+		"Edible Knife = Full SP",M_3,
+		"Knife = Weapon + 3 Notes",M_4;
+	close;
+
+M_1:
+	//WORKS!
+	mes "Ok. We Made Knife[3] Edible";
+	setiteminfo(1201,2,0); //type = 0 : potion
+	setitemscript(1201,"{dispbottom \"* You used Knife[3]\";}");
+	close;
+
+M_2:
+	//WORKS!
+	mes "Ok. We Made Apple Equippable";
+	//item type -> headgear
+	setiteminfo(512,2,5); //type = 5
+	//where to equip to
+	setiteminfo(512,5,512); //equip = 512
+	//set as headgear location
+	setiteminfo(512,11,256); //loc = 256
+	//set Headgear Sprite ID
+	setiteminfo(512,14,85); //view id = 85
+
+	setitemscript(512,"{dispbottom \"* Other item's changed\";}",0);
+	setitemscript(512,"{dispbottom \"* Equipped\";}",1);
+	setitemscript(512,"{dispbottom \"* Unequipped\";}",2);
+	close;
+
+M_3:
+	//WORKS!
+	mes "Ok. Now Edible Knife[3] restores your SP";
+	setitemscript(1201,2,0);
+	setitemscript(1201,"{dispbottom \"* You ate Knife[3] + Full SP\"; percentheal 0,100;}");
+	close;
+
+M_4:
+	//WORKS!
+	mes "Ok. We Made Knife... a weapon. But added 3 notes.";
+	setiteminfo(1201,2,4); //type = 4 : weapon again
+	setitemscript(1201,"{dispbottom \"* 1 Used\";}",0);
+	setitemscript(1201,"{dispbottom \"* 2 Equipped\";}",1);
+	setitemscript(1201,"{dispbottom \"* 3 Unequipped\";}",2);
+	close;
+
+}
+

+ 1 - 1
src/map/itemdb.h

@@ -51,6 +51,7 @@ struct item_data {
 	int look;
 	int elv;
 	int wlv;
+	int view_id;
 //Lupus: I rearranged order of these fields due to compatibility with ITEMINFO script command
 //		some script commands should be revised as well...
 	unsigned int class_base[3];	//Specifies if the base can wear this item (split in 3 indexes per type: 1-1, 2-1, 2-2)
@@ -73,7 +74,6 @@ struct item_data {
 		unsigned autoequip: 1;
 	} flag;
 	short gm_lv_trade_override;	//GM-level to override trade_restriction
-	int view_id;
 };
 
 struct item_group {

+ 67 - 7
src/map/script.c

@@ -3793,6 +3793,7 @@ BUILDIN_FUNC(charisalpha);//isalpha [valaris]
 BUILDIN_FUNC(fakenpcname); // [Lance]
 BUILDIN_FUNC(compare); // Lordalfa, to bring strstr to Scripting Engine
 BUILDIN_FUNC(getiteminfo); //[Lupus] returns Items Buy / sell Price, etc info
+BUILDIN_FUNC(setiteminfo); //[Lupus] set Items Buy / sell Price, etc info
 BUILDIN_FUNC(getequipcardid); //[Lupus] returns card id from quipped item card slot N
 // [zBuffer] List of mathematics commands --->
 BUILDIN_FUNC(sqrt);
@@ -4130,6 +4131,7 @@ struct script_function buildin_func[] = {
 	BUILDIN_DEF(fakenpcname,"ssi"), // [Lance]
 	BUILDIN_DEF(compare,"ss"), // Lordalfa - To bring strstr to scripting Engine.
 	BUILDIN_DEF(getiteminfo,"ii"), //[Lupus] returns Items Buy / sell Price, etc info
+	BUILDIN_DEF(setiteminfo,"iii"), //[Lupus] set Items Buy / sell Price, etc info
 	BUILDIN_DEF(getequipcardid,"ii"), //[Lupus] returns CARD ID or other info from CARD slot N of equipped item
 	// [zBuffer] List of mathematics commands --->
 	BUILDIN_DEF(sqrt,"i"),
@@ -4151,7 +4153,7 @@ struct script_function buildin_func[] = {
 	BUILDIN_DEF(autoequip,"ii"),
 	BUILDIN_DEF(setbattleflag,"ss"),
 	BUILDIN_DEF(getbattleflag,"s"),
-	BUILDIN_DEF(setitemscript,"is"), //Set NEW item bonus script. Lupus
+	BUILDIN_DEF(setitemscript,"is*"), //Set NEW item bonus script. Lupus
 	BUILDIN_DEF(disguise,"i"), //disguise player. Lupus
 	BUILDIN_DEF(undisguise,"*"), //undisguise player. Lupus
 	BUILDIN_DEF(getmonsterinfo,"ii"), //Lupus
@@ -9882,6 +9884,7 @@ BUILDIN_FUNC(getitemslots)
 		11 look;
 		12 elv;
 		13 wlv;
+		14 view id
  *------------------------------------------
  */
 BUILDIN_FUNC(getiteminfo)
@@ -9902,6 +9905,50 @@ BUILDIN_FUNC(getiteminfo)
 	return 0;
 }
 
+/*==========================================
+ * Set some values of an item [Lupus]
+ * Price, Weight, etc...
+	setiteminfo(itemID,n,Value), where n
+		0 value_buy;
+		1 value_sell;
+		2 type;
+		3 maxchance = Max drop chance of this item e.g. 1 = 0.01% , etc..
+				if = 0, then monsters don't drop it at all (rare or a quest item)
+				if = 10000, then this item is sold in NPC shops only
+		4 sex;
+		5 equip;
+		6 weight;
+		7 atk;
+		8 def;
+		9 range;
+		10 slot;
+		11 look;
+		12 elv;
+		13 wlv;
+		14 view id
+  * Returns Value or -1 if the wrong field's been set
+ *------------------------------------------
+ */
+BUILDIN_FUNC(setiteminfo)
+{
+	int item_id,n,value;
+	int *item_arr;
+	struct item_data *i_data;
+
+	item_id	= conv_num(st,& (st->stack->stack_data[st->start+2]));
+	n	= conv_num(st,& (st->stack->stack_data[st->start+3]));
+	value	= conv_num(st,& (st->stack->stack_data[st->start+4]));
+	i_data = itemdb_exists(item_id);
+
+	if (i_data && n>=0 && n<14) {
+		item_arr = (int*)&i_data->value_buy;
+		item_arr[n] = value;
+		push_val(st->stack,C_INT,value);
+	} else
+		push_val(st->stack,C_INT,-1);
+	return 0;
+}
+
 /*==========================================
  * Returns value from equipped item slot n [Lupus]
 	getequipcardid(num,slot)
@@ -12133,23 +12180,36 @@ BUILDIN_FUNC(npcshopattach)
 /*==========================================
  * Returns some values of an item [Lupus]
  * Price, Weight, etc...
-	setiteminfo(itemID,"{new item bonus script}");
+	setitemscript(itemID,"{new item bonus script}",[n]);
+   Where n:
+	0 - script
+	1 - Equip script
+	2 - Unequip script
  *------------------------------------------
  */
 BUILDIN_FUNC(setitemscript)
 {
-	int item_id;
+	int item_id,n=0;
 	char *script;
 	struct item_data *i_data;
+	struct script_code *dstscript;
 
 	item_id	= conv_num(st,& (st->stack->stack_data[st->start+2]));
 	script = conv_str(st,& (st->stack->stack_data[st->start+3]));
+	if( st->end>st->start+4 )
+		n=conv_num(st,& (st->stack->stack_data[st->start+4]));
 	i_data = itemdb_exists(item_id);
 
-	if (i_data && script!=NULL && script[0]=='{') {
-		if(i_data->script!=NULL)
-			script_free_code(i_data->script);
-		i_data->script = parse_script(script, "script_setitemscript", 0, 0);
+	if (i_data && script!=NULL && script[0]=='{' && n<3) {
+		if(n==2)
+			dstscript = i_data->unequip_script;
+		else if(n==1)
+			dstscript = i_data->equip_script;
+		else
+			dstscript = i_data->script;
+		if(dstscript)
+			script_free_code(dstscript);
+		dstscript = parse_script(script, "script_setitemscript", 0, 0);
 		push_val(st->stack,C_INT,1);
 	} else
 		push_val(st->stack,C_INT,0);