summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorgumi <git@gumi.ca>2020-07-20 19:44:14 +0000
committergumi <git@gumi.ca>2020-07-20 19:44:14 +0000
commit37e5cf5bec4e6badeb9c33ae7c8870c7a693d243 (patch)
treee41866b881ba2d9fd464ca006443ad6969a4f917
parentd320a2838d91ba7088978c131333e51bfd482d5b (diff)
parent80f552c29bd471806da1f2ad6dd750cd12933b2c (diff)
downloadserverdata-37e5cf5bec4e6badeb9c33ae7c8870c7a693d243.tar.gz
serverdata-37e5cf5bec4e6badeb9c33ae7c8870c7a693d243.tar.bz2
serverdata-37e5cf5bec4e6badeb9c33ae7c8870c7a693d243.tar.xz
serverdata-37e5cf5bec4e6badeb9c33ae7c8870c7a693d243.zip
Merge branch 'legacydata' into 'master'
add functions to get Legacy and Vault account data See merge request evol/serverdata!242
-rw-r--r--npc/functions/bitwise.txt23
-rw-r--r--npc/functions/legacy.txt238
-rw-r--r--npc/functions/main.txt21
-rw-r--r--npc/functions/vault.txt74
-rw-r--r--npc/scripts.conf3
5 files changed, 359 insertions, 0 deletions
diff --git a/npc/functions/bitwise.txt b/npc/functions/bitwise.txt
new file mode 100644
index 00000000..58ad8b5c
--- /dev/null
+++ b/npc/functions/bitwise.txt
@@ -0,0 +1,23 @@
+/**
+ * gets a bitmasked value in a variable
+ *
+ * @arg 0 - the variable
+ * @arg 1 - mask
+ * @arg 2 - shift
+ */
+function script bitwise_get {
+ return (getarg(0) & getarg(1)) >> getarg(2, 0);
+}
+
+/**
+ * sets a bitmasked value in a variable
+ *
+ * @arg 0 - the target variable
+ * @arg 1 - mask
+ * @arg 2 - shift
+ * @arg 3 - new value
+ * @return a reference to the variable
+ */
+function script bitwise_set {
+ return set(getarg(0), (getarg(0) & ~(getarg(1))) | (getarg(3, 0) << getarg(2, 0)));
+}
diff --git a/npc/functions/legacy.txt b/npc/functions/legacy.txt
new file mode 100644
index 00000000..5f5ad026
--- /dev/null
+++ b/npc/functions/legacy.txt
@@ -0,0 +1,238 @@
+// NOTE: no script other than the functions in this file should EVER access
+// ##LEGACY[] or LEGACY[]
+
+/**
+ * gets the timestamp of when the attached or provided account was ported from
+ * the Legacy snapshot through Vault
+ *
+ * Example:
+ * getlegacyporttime();
+ *
+ * @param 0? - char name / account id (defaults to attached player)
+ * @return timestamp (seconds)
+ */
+function script getlegacyporttime {
+ // we dereference the variable (+ 0) to avoid accidental assignment
+ return 0+ getvariableofpc(##LEGACY[1], nameid2id(getarg(0, "")), 0);
+}
+
+/**
+ * gets the former account id that was assigned to the attached or provided
+ * account on the Legacy server
+ *
+ * Example:
+ * getlegacyaccountid();
+ *
+ * @param 0? - char name / account id (defaults to attached player)
+ * @return former account id
+ */
+function script getlegacyaccountid {
+ // we dereference the variable (+ 0) to avoid accidental assignment
+ return 0+ getvariableofpc(##LEGACY[0], nameid2id(getarg(0, "")), 0);
+}
+
+/**
+ * checks whether the attached or provided account is a former Legacy account
+ *
+ * Example:
+ * islegacyaccount()
+ *
+ * @param 0? - char name / account id (defaults to attached player)
+ * @return true/false
+ */
+function script islegacyaccount {
+ return getlegacyaccountid(getarg(0, "")) > 0;
+}
+
+/**
+ * gets the former char id that was assigned to the attached or provided
+ * character on the Legacy server
+ *
+ * Example:
+ * getlegacycharid();
+ *
+ * @param 0? - char name / account id (defaults to attached player)
+ * @return former char id
+ */
+function script getlegacycharid {
+ // we dereference the variable (+ 0) to avoid accidental assignment
+ return 0+ getvariableofpc(LEGACY[0], nameid2id(getarg(0, "")), 0);
+}
+
+/**
+ * checks whether the attached or provided character is a former Legacy char
+ *
+ * Example:
+ * islegacychar()
+ *
+ * @param 0? - char name / account id (defaults to attached player)
+ * @return true/false
+ */
+function script islegacychar {
+ return getlegacycharid(getarg(0, "")) > 0;
+}
+
+/**
+ * gets the timestamp of when the attached or provided account completed the
+ * tutorial on the Legacy server
+ *
+ * Example:
+ * getlegacytuttime("player name")
+ *
+ * @param 0? - char name / account id (defaults to attached player)
+ * @return timestamp (seconds)
+ */
+function script getlegacytuttime {
+ .@tut_var = getvariableofpc(LEGACY[2], nameid2id(getarg(0, "")), 0);
+ return .@tut_var < 0x7F ? 0 : .@tut_var;
+}
+
+/**
+ * gets the level the attached or provided player had on the Legacy server at
+ * snapshot time
+ *
+ * Example:
+ * getlegacylevel("player name")
+ *
+ * @param 0? - char name / account id (defaults to attached player)
+ * @return base level
+ */
+function script getlegacylevel {
+ return bitwise_get(getvariableofpc(LEGACY[1], nameid2id(getarg(0, "")), 0), 0x000000FF, 0);
+}
+
+/**
+ * gets the boss points the attached or provided player had on the Legacy server
+ * at snapshot time
+ *
+ * Example:
+ * getlegacybosspoints("player name")
+ *
+ * @param 0? - char name / account id (defaults to attached player)
+ * @return boss points
+ */
+function script getlegacybosspoints {
+ return bitwise_get(getvariableofpc(LEGACY[1], nameid2id(getarg(0, "")), 0), 0x7FFFFF00, 8);
+}
+
+
+
+// the functions below can be used to mimic a Legacy account for local testing
+
+
+/**
+ * mimics a legacy account for local testing
+ *
+ * Example:
+ * setfakelegacyaccount("player name");
+ *
+ * @param 0? - char name / account id (defaults to attached player)
+ * @param 1? - legacy level (defaults to 99)
+ * @param 2? - legacy boss points (defaults to 5000)
+ * @return true/false
+ */
+function script setfakelegacyaccount {
+ if (!debug) {
+ consolemes(CONSOLEMES_ERROR, "setfakelegacyaccount() can only be used in debug mode");
+ return false;
+ }
+
+ .@acc = nameid2id(getarg(0, ""));
+
+ if (.@acc < 1) {
+ // player not found
+ return false;
+ }
+
+ // set the legacy account id to the current account id
+ set(getvariableofpc(##LEGACY[0], .@acc), .@acc);
+
+ // set the port time to yesterday
+ set(getvariableofpc(##LEGACY[1], .@acc), time_from_days(-1));
+
+ // set the legacy tut var to 180 days ago
+ set(getvariableofpc(LEGACY[2], .@acc), time_from_days(-180));
+
+ // set the legacy level
+ bitwise_set(getvariableofpc(LEGACY[1], .@acc), 0x000000FF, 0, getarg(1, 99));
+
+ // set the legacy boss points
+ bitwise_set(getvariableofpc(LEGACY[1], .@acc), 0x7FFFFF00, 8, getarg(2, 5000));
+ return true;
+}
+
+/**
+ * gets the inventory the attached or provided char had on the Legacy server at
+ * snapshot time
+ *
+ * Example:
+ * .@size = getlegacyinventory(.@item, .@amount);
+ *
+ * @param 0 - a reference to an array variable to hold the item ids
+ * @param 1 - a reference to an array variable to hold the item qty
+ * @param 2? - char name / account id (defaults to attached player)
+ * @return number of entries added to the arrays
+ */
+function script getlegacyinventory {
+ .@char = getlegacycharid(getarg(2, ""));
+
+ if (.@char < 1) {
+ consolemes(CONSOLEMES_ERROR, "getlegacyinventory: target legacy character not found");
+ return 0;
+ }
+
+ if ((getdatatype(getarg(0)) & (DATATYPE_VAR | DATATYPE_INT)) == 0) {
+ consolemes(CONSOLEMES_ERROR, "getlegacyinventory: first argument should be an integer array");
+ return 0;
+ }
+
+ if ((getdatatype(getarg(1)) & (DATATYPE_VAR | DATATYPE_INT)) == 0) {
+ consolemes(CONSOLEMES_ERROR, "getlegacyinventory: second argument should be an integer array");
+ return 0;
+ }
+
+ freeloop(true);
+ .@rows = query_sql(sprintf("SELECT nameid, amount FROM legacy.inventory WHERE char_id = '%d';", .@char),
+ getarg(0), getarg(1));
+ freeloop(false);
+
+ return .@rows;
+}
+
+/**
+ * gets the storage the attached or provided account had on the Legacy server at
+ * snapshot time
+ *
+ * Example:
+ * .@size = getlegacystorage(.@item, .@amount);
+ *
+ * @param 0 - a reference to an array variable to hold the item ids
+ * @param 1 - a reference to an array variable to hold the item qty
+ * @param 2? - char name / account id (defaults to attached player)
+ * @return number of entries added to the arrays
+ */
+function script getlegacystorage {
+ .@acc = getlegacyaccountid(getarg(2, ""));
+
+ if (.@acc < 1) {
+ consolemes(CONSOLEMES_ERROR, "getlegacystorage: target legacy account not found");
+ return 0;
+ }
+
+ if ((getdatatype(getarg(0)) & (DATATYPE_VAR | DATATYPE_INT)) == 0) {
+ consolemes(CONSOLEMES_ERROR, "getlegacystorage: first argument should be an integer array");
+ return 0;
+ }
+
+ if ((getdatatype(getarg(1)) & (DATATYPE_VAR | DATATYPE_INT)) == 0) {
+ consolemes(CONSOLEMES_ERROR, "getlegacystorage: second argument should be an integer array");
+ return 0;
+ }
+
+ freeloop(true);
+ .@rows = query_sql(sprintf("SELECT nameid, amount FROM legacy.storage WHERE account_id = '%d';", .@acc),
+ getarg(0), getarg(1));
+ freeloop(false);
+
+ return .@rows;
+}
diff --git a/npc/functions/main.txt b/npc/functions/main.txt
index e4c4cd88..1ae37a35 100644
--- a/npc/functions/main.txt
+++ b/npc/functions/main.txt
@@ -6,6 +6,27 @@
// Description:
// Build in functions.
+/**
+ * checks whether the given argument is a char name or account id
+ * and tries to convert it to an account id
+ *
+ * @arg 0 - char name or account id
+ * @return the account id
+ */
+function script nameid2id {
+ if ((getdatatype(getarg(0, "")) & DATATYPE_STR) != 0) {
+ if (getarg(0, "") == "") {
+ return playerattached();
+ } else {
+ return getcharid(CHAR_ID_ACCOUNT, getarg(0));
+ }
+ } else if (getarg(0) == 0) {
+ return playerattached();
+ } else {
+ return getarg(0);
+ }
+}
+
function script menuimage {
return getarg(0) + "|" + getarg(1);
}
diff --git a/npc/functions/vault.txt b/npc/functions/vault.txt
new file mode 100644
index 00000000..05d65886
--- /dev/null
+++ b/npc/functions/vault.txt
@@ -0,0 +1,74 @@
+// TODO: create a Vault hercules plugin for native support
+
+// NOTE: no script other than the functions in this file should EVER access
+// ##VAULT[] or the vault-bound variables
+
+/**
+ * Gets the Vault account ID of the provided or attached player.
+ * If the server does not use Vault, it returns a virtual Vault ID.
+ *
+ * Example:
+ * getvaultid("player name");
+ *
+ * @param 0? - char name / account id (defaults to attached player)
+ * @return the Vault ID
+ */
+function script getvaultid {
+ if (SERVER_USES_VAULT) {
+ // we dereference the variable to avoid accidental assignment
+ return 0+ getvariableofpc(##VAULT[0], nameid2id(getarg(0, "")));
+ } else {
+ return nameid2id(getarg(0, ""));
+ }
+}
+
+/**
+ * gets a (fake) vault account-bound variable.
+ * right now these are map-server global variables so they should be used
+ * sparingly
+ *
+ * Example:
+ * set(getvaultvar(VAR$), "foo bar");
+ *
+ * @param 0 - a variable name without prefix
+ * @param 1? - char name / account id (defaults to attached player)
+ * @return a reference to the variable
+ */
+function script getvaultvar {
+ if ((getdatatype(getarg(0)) & DATATYPE_VAR) == 0) {
+ consolemes(CONSOLEMES_ERROR, "getvaultvar: first argument should be a variable");
+ end;
+ }
+
+ .@var$ = data_to_string(getarg(0));
+
+ if (charat(.@var$, 0) == "." || charat(.@var$, 0) == "@" ||
+ charat(.@var$, 0) == "$" || charat(.@var$, 0) == "#") {
+ consolemes(CONSOLEMES_ERROR, "getvaultvar: the variable must be unprefixed");
+ end;
+ }
+
+ if (SERVER_USES_VAULT) {
+ .@vault = getvaultid(getarg(1, ""));
+ return getd(sprintf("$VAULT_%s[%i]", .@var$, .@vault));
+ } else {
+ return getvariableofpc(getd(sprintf("##%s", .@var$)), nameid2id(getarg(1, "")));
+ }
+}
+
+/**
+ * sets a (fake) vault account-bound variable.
+ * right now these are map-server global variables so they should be used
+ * sparingly
+ *
+ * Example:
+ * setvaultvar(FOO$, "bar");
+ *
+ * @param 0 - a variable name without prefix
+ * @param 1 - the value to set
+ * @param 2? - char name / account id (defaults to attached player)
+ * @return a reference to the variable
+ */
+function script setvaultvar {
+ return set(getvaultvar(getarg(0), getarg(2, "")), getarg(1));
+}
diff --git a/npc/scripts.conf b/npc/scripts.conf
index d15eaef7..edc58478 100644
--- a/npc/scripts.conf
+++ b/npc/scripts.conf
@@ -13,9 +13,12 @@
"npc/functions/math.txt",
"npc/functions/warp.txt",
"npc/functions/gender.txt",
+"npc/functions/bitwise.txt",
// Misc functions
"npc/functions/main.txt",
+"npc/functions/legacy.txt",
+"npc/functions/vault.txt",
"npc/functions/asleep.txt",
"npc/functions/barber.txt",
"npc/functions/clientversion.txt",