瀏覽代碼

Implementation of setinstancevar (#6374)

* Added getinstancevar alias of getvariableofinstance
* Fixed #6353

Thanks to @Everade 
Co-authored-by: Lemongrass3110 <lemongrass@kstp.at>
Atemo 3 年之前
父節點
當前提交
8eef9f9d36
共有 2 個文件被更改,包括 83 次插入11 次删除
  1. 17 4
      doc/script_commands.txt
  2. 66 7
      src/map/script.cpp

+ 17 - 4
doc/script_commands.txt

@@ -482,7 +482,7 @@ nothing  - A permanent variable attached to the character, the default variable
 "'"      - An instance variable.
 "'"      - An instance variable.
            These are used with the instancing system and are unique to each
            These are used with the instancing system and are unique to each
            instance type. Can be accessed from inside the instance or by calling
            instance type. Can be accessed from inside the instance or by calling
-           'getvariableofinstance'.
+           'getinstancevar'.
 "#"      - A permanent local account variable.
 "#"      - A permanent local account variable.
            They are stored by char-server in the `acc_reg_num` table and
            They are stored by char-server in the `acc_reg_num` table and
            `acc_reg_str`.
            `acc_reg_str`.
@@ -9419,17 +9419,30 @@ Examples:
 
 
 ---------------------------------------
 ---------------------------------------
 
 
-*getvariableofinstance(<variable>,<instance id>);
+*getinstancevar(<variable>,<instance id>);
 
 
 Returns a reference to an instance variable (' prefix) of the specific instance ID.
 Returns a reference to an instance variable (' prefix) of the specific instance ID.
 This can only be used to get ' variables.
 This can only be used to get ' variables.
 
 
 Examples:
 Examples:
 	// This will set the .@s variable to the value of 'var variable of the specific instance ID.
 	// This will set the .@s variable to the value of 'var variable of the specific instance ID.
-	set .@s, getvariableofinstance('var, instance_id(IM_PARTY));
+	set .@s, getinstancevar('var, instance_id(IM_PARTY));
 
 
 	// This will set the 'var variable of the specific instance ID to 1.
 	// This will set the 'var variable of the specific instance ID to 1.
-	set getvariableofinstance('var, instance_id(IM_GUILD)), 1;
+	set getinstancevar('var, instance_id(IM_GUILD)), 1;
+
+---------------------------------------
+
+*setinstancevar(<variable>,<value>,<instance id>);
+
+This command will set an instance variable to the value that the expression results in.
+See 'set' command for more information.
+
+Returns the variable reference.
+
+Examples:
+	// This will set the 'var variable of the specific instance ID to 9.
+	setinstancevar('var, 9, instance_id(IM_GUILD));
 
 
 ---------------------------------------
 ---------------------------------------
 
 

+ 66 - 7
src/map/script.cpp

@@ -25243,13 +25243,13 @@ BUILDIN_FUNC(achievement_condition){
 /// Returns a reference to a variable of the specific instance ID.
 /// Returns a reference to a variable of the specific instance ID.
 /// Returns 0 if an error occurs.
 /// Returns 0 if an error occurs.
 ///
 ///
-/// getvariableofinstance(<variable>, <instance ID>) -> <reference>
-BUILDIN_FUNC(getvariableofinstance)
+/// getinstancevar(<variable>, <instance ID>) -> <reference>
+BUILDIN_FUNC(getinstancevar)
 {
 {
 	struct script_data* data = script_getdata(st, 2);
 	struct script_data* data = script_getdata(st, 2);
 
 
 	if (!data_isreference(data)) {
 	if (!data_isreference(data)) {
-		ShowError("buildin_getvariableofinstance: %s is not a variable.\n", script_getstr(st, 2));
+		ShowError("buildin_getinstancevar: %s is not a variable.\n", script_getstr(st, 2));
 		script_reportdata(data);
 		script_reportdata(data);
 		script_pushnil(st);
 		script_pushnil(st);
 		st->state = END;
 		st->state = END;
@@ -25259,7 +25259,7 @@ BUILDIN_FUNC(getvariableofinstance)
 	const char* name = reference_getname(data);
 	const char* name = reference_getname(data);
 
 
 	if (*name != '\'') {
 	if (*name != '\'') {
-		ShowError("buildin_getvariableofinstance: Invalid scope. %s is not an instance variable.\n", name);
+		ShowError("buildin_getinstancevar: Invalid scope. %s is not an instance variable.\n", name);
 		script_reportdata(data);
 		script_reportdata(data);
 		script_pushnil(st);
 		script_pushnil(st);
 		st->state = END;
 		st->state = END;
@@ -25269,7 +25269,7 @@ BUILDIN_FUNC(getvariableofinstance)
 	int instance_id = script_getnum(st, 3);
 	int instance_id = script_getnum(st, 3);
 
 
 	if (instance_id <= 0) {
 	if (instance_id <= 0) {
-		ShowError("buildin_getvariableofinstance: Invalid instance ID %d.\n", instance_id);
+		ShowError("buildin_getinstancevar: Invalid instance ID %d.\n", instance_id);
 		script_pushnil(st);
 		script_pushnil(st);
 		st->state = END;
 		st->state = END;
 		return SCRIPT_CMD_FAILURE;
 		return SCRIPT_CMD_FAILURE;
@@ -25278,7 +25278,7 @@ BUILDIN_FUNC(getvariableofinstance)
 	std::shared_ptr<s_instance_data> im = util::umap_find(instances, instance_id);
 	std::shared_ptr<s_instance_data> im = util::umap_find(instances, instance_id);
 
 
 	if (im->state != INSTANCE_BUSY) {
 	if (im->state != INSTANCE_BUSY) {
-		ShowError("buildin_getvariableofinstance: Unknown instance ID %d.\n", instance_id);
+		ShowError("buildin_getinstancevar: Unknown instance ID %d.\n", instance_id);
 		script_pushnil(st);
 		script_pushnil(st);
 		st->state = END;
 		st->state = END;
 		return SCRIPT_CMD_FAILURE;
 		return SCRIPT_CMD_FAILURE;
@@ -25291,6 +25291,62 @@ BUILDIN_FUNC(getvariableofinstance)
 	return SCRIPT_CMD_SUCCESS;
 	return SCRIPT_CMD_SUCCESS;
 }
 }
 
 
+/// Sets the value of an instance variable.
+///
+/// setinstancevar(<variable>,<value>,<instance ID>)
+BUILDIN_FUNC(setinstancevar)
+{
+	const char *command = script_getfuncname(st);
+	struct script_data* data = script_getdata(st, 2);
+
+	if (!data_isreference(data)) {
+		ShowError("buildin_%s: %s is not a variable.\n", command, script_getstr(st, 2));
+		script_reportdata(data);
+		script_pushnil(st);
+		st->state = END;
+		return SCRIPT_CMD_FAILURE;
+	}
+
+	const char* name = reference_getname(data);
+
+	if (*name != '\'') {
+		ShowError("buildin_%s: Invalid scope. %s is not an instance variable.\n", command, name);
+		script_reportdata(data);
+		script_pushnil(st);
+		st->state = END;
+		return SCRIPT_CMD_FAILURE;
+	}
+
+	int instance_id = script_getnum(st, 4);
+
+	if (instance_id <= 0) {
+		ShowError("buildin_%s: Invalid instance ID %d.\n", command, instance_id);
+		script_pushnil(st);
+		st->state = END;
+		return SCRIPT_CMD_FAILURE;
+	}
+
+	std::shared_ptr<s_instance_data> im = util::umap_find(instances, instance_id);
+
+	if (im->state != INSTANCE_BUSY) {
+		ShowError("buildin_%s: Unknown instance ID %d.\n", command, instance_id);
+		script_pushnil(st);
+		st->state = END;
+		return SCRIPT_CMD_FAILURE;
+	}
+
+	script_pushcopy(st, 2);
+
+	struct map_session_data* sd = nullptr;
+
+	if( is_string_variable(name) )
+		set_reg_str( st, sd, reference_getuid(data), name, script_getstr( st, 3 ), &im->regs );
+	else
+		set_reg_num( st, sd, reference_getuid(data), name, script_getnum64( st, 3 ), &im->regs );
+
+	return SCRIPT_CMD_SUCCESS;
+}
+
 /*
 /*
   convertpcinfo(<char_id>,<type>)
   convertpcinfo(<char_id>,<type>)
   convertpcinfo(<account_id>,<type>)
   convertpcinfo(<account_id>,<type>)
@@ -26124,7 +26180,8 @@ struct script_function buildin_func[] = {
 	BUILDIN_DEF(camerainfo,"iii?"),
 	BUILDIN_DEF(camerainfo,"iii?"),
 
 
 	BUILDIN_DEF(achievement_condition,"i"),
 	BUILDIN_DEF(achievement_condition,"i"),
-	BUILDIN_DEF(getvariableofinstance,"ri"),
+	BUILDIN_DEF(getinstancevar,"ri"),
+	BUILDIN_DEF2_DEPRECATED(getinstancevar, "getvariableofinstance","ri", "2021-12-13"),
 	BUILDIN_DEF(convertpcinfo,"vi"),
 	BUILDIN_DEF(convertpcinfo,"vi"),
 	BUILDIN_DEF(isnpccloaked, "??"),
 	BUILDIN_DEF(isnpccloaked, "??"),
 
 
@@ -26135,6 +26192,8 @@ struct script_function buildin_func[] = {
 	BUILDIN_DEF(getenchantgrade, ""),
 	BUILDIN_DEF(getenchantgrade, ""),
 
 
 	BUILDIN_DEF(mob_setidleevent, "is"),
 	BUILDIN_DEF(mob_setidleevent, "is"),
+
+	BUILDIN_DEF(setinstancevar,"rvi"),
 #include "../custom/script_def.inc"
 #include "../custom/script_def.inc"
 
 
 	{NULL,NULL,NULL},
 	{NULL,NULL,NULL},