diff options
author | gumi <git@gumi.ca> | 2020-07-20 19:44:14 +0000 |
---|---|---|
committer | gumi <git@gumi.ca> | 2020-07-20 19:44:14 +0000 |
commit | 37e5cf5bec4e6badeb9c33ae7c8870c7a693d243 (patch) | |
tree | e41866b881ba2d9fd464ca006443ad6969a4f917 /npc | |
parent | d320a2838d91ba7088978c131333e51bfd482d5b (diff) | |
parent | 80f552c29bd471806da1f2ad6dd750cd12933b2c (diff) | |
download | serverdata-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
Diffstat (limited to 'npc')
-rw-r--r-- | npc/functions/bitwise.txt | 23 | ||||
-rw-r--r-- | npc/functions/legacy.txt | 238 | ||||
-rw-r--r-- | npc/functions/main.txt | 21 | ||||
-rw-r--r-- | npc/functions/vault.txt | 74 | ||||
-rw-r--r-- | npc/scripts.conf | 3 |
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", |