This commit is contained in:
lenheart
2024-09-16 17:05:26 +08:00
commit 237bcf8719
53 changed files with 21032 additions and 0 deletions

View File

@@ -0,0 +1,30 @@
/*
文件名:AccountCargoClass.nut
路径:Dps_A/BaseClass/AccountCargoClass/AccountCargoClass.nut
创建日期:2024-09-16 10:00
文件用途:账号金库类
*/
class AccountCargo extends Base_C_Object {
SUser = null;
constructor(CObject, gSUser) {
base.constructor(CObject);
SUser = gSUser;
}
//获取空格子
function GetEmptySlot() {
return Sq_CallFunc(S_Ptr("0x0828a580"), "int", ["pointer"], this.C_Object);
}
//存储物品
function InsertItem(ItemObj, Slot) {
Sq_CallFunc(S_Ptr("0x08289c82"), "int", ["pointer", "pointer", "int"], this.C_Object, ItemObj.C_Object, Slot);
}
//刷新列表
function SendItemList() {
return Sq_CallFunc(S_Ptr("0x0828a88a"), "int", ["pointer"], this.C_Object);
}
}

View File

@@ -0,0 +1,12 @@
/*
文件名:BaseBindenvClass.nut
路径:Dps_A/BaseClass/BaseInfoClass/BaseBindenvClass.nut
创建日期:2024-05-04 12:27
文件用途:
*/
class BaseBindenv {
Info = null;
constructor() {
getroottable().rawset("BaseBindenvInfo_" + clock(), this);
}
}

View File

@@ -0,0 +1,7 @@
class Base_C_Object {
C_Object = null;
constructor(gObject) {
this.C_Object = gObject;
}
}

View File

@@ -0,0 +1,34 @@
/*
文件名:BattleFieldClass.nut
路径:Dps_A/BaseClass/BattleFieldClass/BattleFieldClass.nut
创建日期:2024-04-28 09:34
文件用途:
*/
class BattleField extends Base_C_Object {
Attribute = null;
constructor(CObject) {
base.constructor(CObject);
Attribute = Sq_Point2Blob(CObject, 120);
}
//获取副本
function GetDgn() {
local Ret = Sq_BattleField_GetDgn(C_Object);
if (Ret) {
return Dungeon(Ret);
}
return Ret;
}
function add_monster_APC_AI(index) {
Sq_CallFunc(S_Ptr("0x8301D76"), "void", ["pointer", "int"], C_Object, index);
}
//获取深渊派对情况
function GetHellDifficulty() {
local Sia = Sq_Point2Blob(C_Object, 500);
Sia.seek(460);
return (Sia.readn('c'))
}
}

View File

@@ -0,0 +1,30 @@
/*
文件名:DungeonClass.nut
路径:Dps_A/BaseClass/DungeonClass/DungeonClass.nut
创建日期:2024-04-27 20:31
文件用途:副本对象类
*/
class Dungeon extends Base_C_Object {
Attribute = null;
constructor(CObject) {
base.constructor(CObject);
Attribute = Sq_Point2Blob(CObject, 120);
}
//获取副本ID
function GetId() {
return Sq_Dungeon_GetIdex(C_Object);
}
//获取副本名称
function GetName() {
return Sq_CallFunc(S_Ptr("0x081455A6"), "string", ["pointer"], this.C_Object);
}
//获取副本等级
function GetMinLevel() {
return Sq_CallFunc(S_Ptr("0x0814559A"), "int", ["pointer"], this.C_Object);
}
}

View File

@@ -0,0 +1,18 @@
/*
文件名:GameManagerClass.nut
路径:BaseClass/GameManagerClass/GameManagerClass.nut
创建日期:2024-04-09 20:30
文件用途:游戏管理器类
*/
class GameManager extends Base_C_Object {
constructor() {
local CObject = Sq_GameManager_GameManager();
base.constructor(CObject);
}
function GetParty() {
local C_Party = Sq_GameManager_GetParty(C_Object);
return Party(C_Party);
}
}

View File

@@ -0,0 +1,75 @@
/*
文件名:InvenClass.nut
路径:BaseClass/InvenClass/InvenClass.nut
创建日期:2024-04-18 13:26
文件用途:背包类
*/
class Inven extends Base_C_Object {
static INVENTORY_TYPE_BODY = 0; //身上穿的装备(0-26)
static INVENTORY_TYPE_ITEM = 1; //物品栏(0-311)
static INVENTORY_TYPE_AVARTAR = 2; //时装栏(0-104)
static INVENTORY_TYPE_CREATURE = 3; //宠物装备(0-241)
SUser = null;
constructor(CObject, gSUser) {
base.constructor(CObject);
SUser = gSUser;
}
//获得槽位里的对象
function GetSlot(Type, Slot) {
local P = Sq_Inven_GetItem(this.C_Object, Type, Slot);
if (P) {
return Item(P);
}
return null;
}
//通过ID获得槽位
function GetSlotById(Idx) {
return Sq_Inven_GetItemById(this.C_Object, Idx);
}
//检查背包是否拥有指定数量的指定道具
function CheckItemCount(ItemId, ItemCount) {
local SlotIdx = GetSlotById(ItemId);
if (SlotIdx != -1) {
local SlotItem = GetSlot(1, SlotIdx);
if (SlotItem) {
if (SlotItem.GetType() != "装备") {
if (SlotItem.GetAdd_Info() >= ItemCount) return true;
}
}
}
return false;
}
//检查背包是否拥有指定表的道具及数量
function CheckArrItemCount(T) {
local Flag = true;
foreach(value in T) {
if (!CheckItemCount(value.Id, value.Count)) Flag = false;
}
return Flag;
}
//销毁背包中指定表的道具及数量
function DeleteArrItemCount(T) {
foreach(value in T) {
local Slot = GetSlotById(value.Id);
Sq_Inven_RemoveItemFormCount(this.C_Object, 1, Slot, value.Count, 10, 1);
SUser.SendUpdateItemList(1, 0, Slot);
}
}
//销毁背包中指定的道具及数量
function DeleteItemCount(Id, Count) {
local Slot = GetSlotById(Id);
local Ret = Sq_Inven_RemoveItemFormCount(this.C_Object, 1, Slot, Count, 10, 1);
SUser.SendUpdateItemList(1, 0, Slot);
return Ret;
}
}

View File

@@ -0,0 +1,138 @@
/*
文件名:ItemClass.nut
路径:BaseClass/ItemClass/ItemClass.nut
创建日期:2024-04-18 15:10
文件用途:Item类
*/
class Item extends Base_C_Object {
Attribute = null;
IsEmpty = false;
constructor(CObject) {
base.constructor(CObject);
Attribute = Sq_Point2Blob(CObject, 62);
if (GetIndex() == 0) IsEmpty = true;
}
function Output() {
local Str = "[";
foreach(Value in Attribute) {
Str = format("%s%02X", Str, Value);
Str += ",";
}
Str += "]";
print(Str);
}
//获取类型
function GetType() {
Attribute.seek(1);
local Type = Attribute.readn('c');
switch (Type) {
case 1:
return "装备";
case 2:
return "消耗品";
case 3:
return "材料";
case 4:
return "任务材料";
case 10:
return "副职业材料";
default:
return "未知类型";
}
}
//获取编号
function GetIndex() {
Attribute.seek(2);
return Attribute.readn('i');
}
//设置编号
function SetIndex(Index) {
Attribute.seek(2);
Attribute.writen(Index, 'i');
}
//获取强化等级
function GetUpgrade() {
Attribute.seek(6);
return Attribute.readn('c');
}
//设置强化等级
function SetUpgrade(Level) {
Attribute.seek(6);
Attribute.writen(Level, 'c');
}
//获取 品级 或 数量 如果是装备就是品级 如果是其他就是数量
function GetAdd_Info() {
Attribute.seek(7);
return Attribute.readn('i');
}
//设置 品级 或 数量 如果是装备就是品级 如果是其他就是数量
function SetAdd_Info(Value) {
Attribute.seek(7);
Attribute.writen(Value, 'i');
}
//获取耐久度
function GetDurable() {
Attribute.seek(11);
return Attribute.readn('c');
}
//设置耐久度
function SetDurable(Value) {
Attribute.seek(11);
Attribute.writen(Value, 'c');
}
//获取增幅属性
function GetAmplification() {
Attribute.seek(17);
return Attribute.readn('w');
}
//设置增幅属性
function SetAmplification(Value) {
Attribute.seek(17);
Attribute.writen(Value, 'w');
}
//获取锻造属性
function GetForging() {
Attribute.seek(51);
return Attribute.readn('c');
}
//设置锻造属性
function SetForging(Value) {
Attribute.seek(51);
Attribute.writen(Value, 'c');
}
//获取附魔属性
function GetEnchanting() {
Attribute.seek(13);
return Attribute.readn('i');
}
//设置附魔属性
function SetEnchanting(Value) {
Attribute.seek(13);
Attribute.writen(Value, 'i');
}
//刷写装备数据
function Flush() {
Sq_WriteBlobToAddress(C_Object, Attribute);
}
//删除道具
function Delete() {
Sq_Inven_RemoveItem(C_Object);
this = null;
}
}

View File

@@ -0,0 +1,30 @@
//Json类
class Json {
//Table 转 String
function Encode(Table) {
return JSONEncoder.encode(Table);
}
function OldDecode(Str) {
Str = sq_DecondeJson(Str);
local NewStr = "local _M = " + Str + ";\n return _M;\n";
local Func = compilestring(NewStr);
try {
local Obj = Func();
if (typeof(Obj) == "table" || typeof(Obj) == "array") {
if (Obj.len() > 0) return Obj;
}
} catch (exception) {
}
error("错误的包内容: " + NewStr);
return null;
}
//String 转 Table
function Decode(Str) {
return JSONParser.parse(Str);
}
}

View File

@@ -0,0 +1,702 @@
/**
* JSON Parser
*
* @author Mikhail Yurasov <mikhail@electricimp.com>
* @package JSONParser
* @version 1.0.1
*/
/**
* JSON Parser
* @package JSONParser
*/
class JSONParser {
// should be the same for all components within JSONParser package
static version = "1.0.1";
/**
* Parse JSON string into data structure
*
* @param {string} str
* @param {function({string} value[, "number"|"string"])|null} converter
* @return {*}
*/
function parse(str, converter = null) {
local state;
local stack = []
local container;
local key;
local value;
// actions for string tokens
local string = {
go = function() {
state = "ok";
},
firstokey = function() {
key = value;
state = "colon";
},
okey = function() {
key = value;
state = "colon";
},
ovalue = function() {
value = this._convert(value, "string", converter);
state = "ocomma";
}.bindenv(this),
firstavalue = function() {
value = this._convert(value, "string", converter);
state = "acomma";
}.bindenv(this),
avalue = function() {
value = this._convert(value, "string", converter);
state = "acomma";
}.bindenv(this)
};
// the actions for number tokens
local number = {
go = function() {
state = "ok";
},
ovalue = function() {
value = this._convert(value, "number", converter);
state = "ocomma";
}.bindenv(this),
firstavalue = function() {
value = this._convert(value, "number", converter);
state = "acomma";
}.bindenv(this),
avalue = function() {
value = this._convert(value, "number", converter);
state = "acomma";
}.bindenv(this)
};
// action table
// describes where the state machine will go from each given state
local action = {
"{": {
go = function() {
stack.push({
state = "ok"
});
container = {};
state = "firstokey";
},
ovalue = function() {
stack.push({
container = container,
state = "ocomma",
key = key
});
container = {};
state = "firstokey";
},
firstavalue = function() {
stack.push({
container = container,
state = "acomma"
});
container = {};
state = "firstokey";
},
avalue = function() {
stack.push({
container = container,
state = "acomma"
});
container = {};
state = "firstokey";
}
},
"}": {
firstokey = function() {
local pop = stack.pop();
value = container;
container = ("container" in pop) ? pop.container : null;
key = ("key" in pop) ? pop.key : null;
state = pop.state;
},
ocomma = function() {
local pop = stack.pop();
container[key] <- value;
value = container;
container = ("container" in pop) ? pop.container : null;
key = ("key" in pop) ? pop.key : null;
state = pop.state;
}
},
"[": {
go = function() {
stack.push({
state = "ok"
});
container = [];
state = "firstavalue";
},
ovalue = function() {
stack.push({
container = container,
state = "ocomma",
key = key
});
container = [];
state = "firstavalue";
},
firstavalue = function() {
stack.push({
container = container,
state = "acomma"
});
container = [];
state = "firstavalue";
},
avalue = function() {
stack.push({
container = container,
state = "acomma"
});
container = [];
state = "firstavalue";
}
},
"]": {
firstavalue = function() {
local pop = stack.pop();
value = container;
container = ("container" in pop) ? pop.container : null;
key = ("key" in pop) ? pop.key : null;
state = pop.state;
},
acomma = function() {
local pop = stack.pop();
container.push(value);
value = container;
container = ("container" in pop) ? pop.container : null;
key = ("key" in pop) ? pop.key : null;
state = pop.state;
}
},
":": {
colon = function() {
// Check if the key already exists
// NOTE previous code used 'if (key in container)...'
// but this finds table ('container') member methods too
local err = false;
foreach(akey, avalue in container) {
if (akey == key) err = true;
break
}
if (err) throw "Duplicate key \"" + key + "\"";
state = "ovalue";
}
},
",": {
ocomma = function() {
container[key] <- value;
state = "okey";
},
acomma = function() {
container.push(value);
state = "avalue";
}
},
"true": {
go = function() {
value = true;
state = "ok";
},
ovalue = function() {
value = true;
state = "ocomma";
},
firstavalue = function() {
value = true;
state = "acomma";
},
avalue = function() {
value = true;
state = "acomma";
}
},
"false": {
go = function() {
value = false;
state = "ok";
},
ovalue = function() {
value = false;
state = "ocomma";
},
firstavalue = function() {
value = false;
state = "acomma";
},
avalue = function() {
value = false;
state = "acomma";
}
},
"null": {
go = function() {
value = null;
state = "ok";
},
ovalue = function() {
value = null;
state = "ocomma";
},
firstavalue = function() {
value = null;
state = "acomma";
},
avalue = function() {
value = null;
state = "acomma";
}
}
};
//
state = "go";
stack = [];
// current tokenizeing position
local start = 0;
try {
local
result,
token,
tokenizer = _JSONTokenizer();
while (token = tokenizer.nextToken(str, start)) {
if ("ptfn" == token.type) {
// punctuation/true/false/null
action[token.value][state]();
} else if ("number" == token.type) {
// number
value = token.value;
number[state]();
} else if ("string" == token.type) {
// string
value = tokenizer.unescape(token.value);
string[state]();
}
start += token.length;
}
} catch (e) {
state = e;
}
// check is the final state is not ok
// or if there is somethign left in the str
if (state != "ok" || regexp("[^\\s]").capture(str, start)) {
local min = @(a, b) a< b ? a : b;
local near = str.slice(start, min(str.len(), start + 10));
throw "JSON Syntax Error near `" + near + "`";
}
return value;
}
/**
* Convert strings/numbers
* Uses custom converter function
*
* @param {string} value
* @param {string} type
* @param {function|null} converter
*/
function _convert(value, type, converter) {
if ("function" == typeof converter) {
// # of params for converter function
local parametercCount = 2;
// .getinfos() is missing on ei platform
if ("getinfos" in converter) {
parametercCount = converter.getinfos().parameters.len() -
1 /* "this" is also included */ ;
}
if (parametercCount == 1) {
return converter(value);
} else if (parametercCount == 2) {
return converter(value, type);
} else {
throw "Error: converter function must take 1 or 2 parameters"
}
} else if ("number" == type) {
return (value.find(".") == null && value.find("e") == null && value.find("E") == null) ? value.tointeger() : value.tofloat();
} else {
return value;
}
}
}
/**
* JSON Tokenizer
* @package JSONParser
*/
class _JSONTokenizer {
_ptfnRegex = null;
_numberRegex = null;
_stringRegex = null;
_ltrimRegex = null;
_unescapeRegex = null;
constructor() {
// punctuation/true/false/null
this._ptfnRegex = regexp("^(?:\\,|\\:|\\[|\\]|\\{|\\}|true|false|null)");
// numbers
this._numberRegex = regexp("^(?:\\-?\\d+(?:\\.\\d*)?(?:[eE][+\\-]?\\d+)?)");
// strings
this._stringRegex = regexp("^(?:\\\"((?:[^\\r\\n\\t\\\\\\\"]|\\\\(?:[\"\\\\\\/trnfb]|u[0-9a-fA-F]{4}))*)\\\")");
// ltrim pattern
this._ltrimRegex = regexp("^[\\s\\t\\n\\r]*");
// string unescaper tokenizer pattern
this._unescapeRegex = regexp("\\\\(?:(?:u\\d{4})|[\\\"\\\\/bfnrt])");
}
/**
* Get next available token
* @param {string} str
* @param {integer} start
* @return {{type,value,length}|null}
*/
function nextToken(str, start = 0) {
local
m,
type,
token,
value,
length,
whitespaces;
// count # of left-side whitespace chars
whitespaces = this._leadingWhitespaces(str, start);
start += whitespaces;
if (m = this._ptfnRegex.capture(str, start)) {
// punctuation/true/false/null
value = str.slice(m[0].begin, m[0].end);
type = "ptfn";
} else if (m = this._numberRegex.capture(str, start)) {
// number
value = str.slice(m[0].begin, m[0].end);
type = "number";
} else if (m = this._stringRegex.capture(str, start)) {
// string
value = str.slice(m[1].begin, m[1].end);
type = "string";
} else {
return null;
}
token = {
type = type,
value = value,
length = m[0].end - m[0].begin + whitespaces
};
return token;
}
/**
* Count # of left-side whitespace chars
* @param {string} str
* @param {integer} start
* @return {integer} number of leading spaces
*/
function _leadingWhitespaces(str, start) {
local r = this._ltrimRegex.capture(str, start);
if (r) {
return r[0].end - r[0].begin;
} else {
return 0;
}
}
// unesacape() replacements table
_unescapeReplacements = {
"b": "\b",
"f": "\f",
"n": "\n",
"r": "\r",
"t": "\t"
};
/**
* Unesacape string escaped per JSON standard
* @param {string} str
* @return {string}
*/
function unescape(str) {
local start = 0;
local res = "";
while (start< str.len()) {
local m = this._unescapeRegex.capture(str, start);
if (m) {
local token = str.slice(m[0].begin, m[0].end);
// append chars before match
local pre = str.slice(start, m[0].begin);
res += pre;
if (token.len() == 6) {
// unicode char in format \uhhhh, where hhhh is hex char code
// todo: convert \uhhhh chars
res += token;
} else {
// escaped char
// @see http://www.json.org/
local char = token.slice(1);
if (char in this._unescapeReplacements) {
res += this._unescapeReplacements[char];
} else {
res += char;
}
}
} else {
// append the rest of the source string
res += str.slice(start);
break;
}
start = m[0].end;
}
return res;
}
}
// Copyright (c) 2017 Electric Imp
// This file is licensed under the MIT License
// http://opensource.org/licenses/MIT
class JSONEncoder {
static VERSION = "2.0.0";
// max structure depth
// anything above probably has a cyclic ref
static _maxDepth = 32;
/**
* Encode value to JSON
* @param {table|array|*} value
* @returns {string}
*/
function encode(value) {
return this._encode(value);
}
/**
* @param {table|array} val
* @param {integer=0} depth current depth level
* @private
*/
function _encode(val, depth = 0) {
// detect cyclic reference
if (depth > this._maxDepth) {
throw "Possible cyclic reference";
}
local
r = "",
s = "",
i = 0;
switch (typeof val) {
case "table":
case "class":
s = "";
// serialize properties, but not functions
foreach(k, v in val) {
if (typeof v != "function") {
s += ",\"" + k + "\":" + this._encode(v, depth + 1);
}
}
s = s.len() > 0 ? s.slice(1) : s;
r += "{" + s + "}";
break;
case "array":
s = "";
for (i = 0; i< val.len(); i++) {
s += "," + this._encode(val[i], depth + 1);
}
s = (i > 0) ? s.slice(1) : s;
r += "[" + s + "]";
break;
case "integer":
case "float":
case "bool":
r += val;
break;
case "null":
r += "null";
break;
case "instance":
if ("_serializeRaw" in val && typeof val._serializeRaw == "function") {
// include value produced by _serializeRaw()
r += val._serializeRaw().tostring();
} else if ("_serialize" in val && typeof val._serialize == "function") {
// serialize instances by calling _serialize method
r += this._encode(val._serialize(), depth + 1);
} else {
s = "";
try {
// iterate through instances which implement _nexti meta-method
foreach(k, v in val) {
s += ",\"" + k + "\":" + this._encode(v, depth + 1);
}
} catch (e) {
// iterate through instances w/o _nexti
// serialize properties, but not functions
foreach(k, v in val.getclass()) {
if (typeof v != "function") {
s += ",\"" + k + "\":" + this._encode(val[k], depth + 1);
}
}
}
s = s.len() > 0 ? s.slice(1) : s;
r += "{" + s + "}";
}
break;
case "blob":
// This is a workaround for a known bug:
// on device side Blob.tostring() returns null
// (instaead of an empty string)
r += "\"" + (val.len() ? this._escape(val.tostring()) : "") + "\"";
break;
// strings and all other
default:
r += "\"" + this._escape(val.tostring()) + "\"";
break;
}
return r;
}
/**
* Escape strings according to http://www.json.org/ spec
* @param {string} str
*/
function _escape(str) {
local res = "";
for (local i = 0; i< str.len(); i++) {
local ch1 = (str[i] & 0xFF);
if ((ch1 & 0x80) == 0x00) {
// 7-bit Ascii
ch1 = format("%c", ch1);
if (ch1 == "\"") {
res += "\\\"";
} else if (ch1 == "\\") {
res += "\\\\";
} else if (ch1 == "/") {
res += "\\/";
} else if (ch1 == "\b") {
res += "\\b";
} else if (ch1 == "\f") {
res += "\\f";
} else if (ch1 == "\n") {
res += "\\n";
} else if (ch1 == "\r") {
res += "\\r";
} else if (ch1 == "\t") {
res += "\\t";
} else if (ch1 == "\0") {
res += "\\u0000";
} else {
res += ch1;
}
} else {
if ((ch1 & 0xE0) == 0xC0) {
// 110xxxxx = 2-byte unicode
local ch2 = (str[++i] & 0xFF);
res += format("%c%c", ch1, ch2);
} else if ((ch1 & 0xF0) == 0xE0) {
// 1110xxxx = 3-byte unicode
local ch2 = (str[++i] & 0xFF);
local ch3 = (str[++i] & 0xFF);
res += format("%c%c%c", ch1, ch2, ch3);
} else if ((ch1 & 0xF8) == 0xF0) {
// 11110xxx = 4 byte unicode
local ch2 = (str[++i] & 0xFF);
local ch3 = (str[++i] & 0xFF);
local ch4 = (str[++i] & 0xFF);
res += format("%c%c%c%c", ch1, ch2, ch3, ch4);
}
}
}
return res;
}
}

View File

@@ -0,0 +1,393 @@
/*
文件名:MathClass.nut
路径:BaseClass/MathClass.nut
创建日期:2023-08-26 12:13
文件用途:数学类
*/
class MathClass {
function getDirectionToTargetX(objX, x) {
if (objX > x)
return 0;
else
return 1;
}
/*
* @函数作用: 取随机值 左闭右开
* @参数 name
* @返回值
*/
function Rand(Min, Max) {
local In = rand();
local Ret = (Min + (Max - Min) * (In / RAND_MAX.tofloat())).tointeger();
return Ret;
}
function getCollisionByObjBox(obj, box) {
local x = obj.X;
local y = obj.Y;
local z = obj.Z;
local ArrBuf = [];
if (obj.Direction == 1) {
local pleft = [x + box[0], y + box[1], z + box[2]];
local pright = [x + box[0] + box[3], y + box[1] + box[4], z + box[2] + box[5]];
ArrBuf.extend(pleft);
ArrBuf.extend(pright);
} else {
local pleft = [x - box[0], y + box[1], z + box[2]];
local pright = [x - box[0] - box[3], y + box[1] + box[4], z + box[2] + box[5]];
ArrBuf.extend(pleft);
ArrBuf.extend(pright);
}
return ArrBuf;
}
function GetDistancePos(startX, direction, offsetX) {
if (direction == 0)
return startX - offsetX;
return startX + offsetX;
}
//通过坐标获得两点旋转角度
function getRorateAngleByCurrentPos(x1, y1, z1, x2, y2, z2) {
return 0;
}
//贝塞尔曲线构造的抛物线运动支持开始z轴(obj,curT,lastZ,moveT)
function sq_BParabola(currentT, maxT, initZPos, jumpHeight, lastZPos) {
local z = getBeizeri(currentT, maxT, initZPos, initZPos + jumpHeight, initZPos + jumpHeight, lastZPos);
return z.tointeger();
}
//获得抛物线(不支持开始z轴)
function sq_Parabola(x, b, c) {
local a = (-b.tofloat() * 4) / (c.tofloat() * c.tofloat());
return a.tofloat() * (x.tofloat() - c.tofloat() / 2) * (x.tofloat() - c.tofloat() / 2) + b.tofloat();
}
//获得两点之间平面的距离.
function Get2D_Distance(x1, y1, x2, y2) {
local offsetX = x1 - x2;
local offsetY = (y1 - y2) * 0.29;
return sqrt(offsetX * offsetX + offsetY * offsetY);
}
//判断给定的角度是否在startA和endA角度之间(startA与endA形成的锐角内)
function CheckAngleIsInArea(judge, startA, endA) {
if (startA< 0)
startA = startA + 360.0;
if (endA< 0)
endA = endA + 360.0;
if (startA > 360.0)
startA = startA - 360.0;
if (endA > 360.0)
endA = endA - 360.0;
if (startA > 0 && startA< 90 && endA > 270 && endA< 360) {
if (judge > 270 && judge< 360) {
if (endA< judge && judge< startA + 360)
return true;
} else if (judge< 90) {
if (endA< judge + 360 && judge + 360< startA + 360)
return true;
}
} else {
if (endA > judge && judge > startA)
return true;
}
return false;
}
//弧度制转为角度制
function toDegree(x) {
return x * 57.29577;
}
//角度转为弧度
function toRadian(x) {
return x * 0.01745;
}
//立方体与立方体之间碰撞 暂未测试
function CubeAndCubeCollection(c1StartX, c1StartY, c1StartZ, c1EndX, c1EndY, c1EndZ, c2StartX, c2StartY, c2StartZ, c2EndX, c2EndY, c2EndZ) {
if (pointIsInCubeArea(c1StartX, c1StartY, c1StartZ, c2StartX, c2StartY, c2StartZ, c2EndX, c2EndY, c2EndZ))
return true;
if (pointIsInCubeArea(c1EndX, c1StartY, c1StartZ, c2StartX, c2StartY, c2StartZ, c2EndX, c2EndY, c2EndZ))
return true;
if (pointIsInCubeArea(c1StartX, c1EndY, c1StartZ, c2StartX, c2StartY, c2StartZ, c2EndX, c2EndY, c2EndZ))
return true;
if (pointIsInCubeArea(c1EndX, c1EndY, c1StartZ, c2StartX, c2StartY, c2StartZ, c2EndX, c2EndY, c2EndZ))
return true;
if (pointIsInCubeArea(c1StartX, c1StartY, c1EndZ, c2StartX, c2StartY, c2StartZ, c2EndX, c2EndY, c2EndZ))
return true;
if (pointIsInCubeArea(c1EndX, c1StartY, c1EndZ, c2StartX, c2StartY, c2StartZ, c2EndX, c2EndY, c2EndZ))
return true;
if (pointIsInCubeArea(c1StartX, c1EndY, c1EndZ, c2StartX, c2StartY, c2StartZ, c2EndX, c2EndY, c2EndZ))
return true;
if (pointIsInCubeArea(c1EndX, c1EndY, c1EndZ, c2StartX, c2StartY, c2StartZ, c2EndX, c2EndY, c2EndZ))
return true;
if (pointIsInCubeArea(c2StartX, c2StartY, c2StartZ, c1StartX, c1StartY, c1StartZ, c1EndX, c1EndY, c1EndZ))
return true;
if (pointIsInCubeArea(c2EndX, c2StartY, c2StartZ, c1StartX, c1StartY, c1StartZ, c1EndX, c1EndY, c1EndZ))
return true;
if (pointIsInCubeArea(c2StartX, c2EndY, c2StartZ, c1StartX, c1StartY, c1StartZ, c1EndX, c1EndY, c1EndZ))
return true;
if (pointIsInCubeArea(c2EndX, c2EndY, c2StartZ, c1StartX, c1StartY, c1StartZ, c1EndX, c1EndY, c1EndZ))
return true;
if (pointIsInCubeArea(c2StartX, c2StartY, c2EndZ, c1StartX, c1StartY, c1StartZ, c1EndX, c1EndY, c1EndZ))
return true;
if (pointIsInCubeArea(c2EndX, c2StartY, c2EndZ, c1StartX, c1StartY, c1StartZ, c1EndX, c1EndY, c1EndZ))
return true;
if (pointIsInCubeArea(c2StartX, c2EndY, c2EndZ, c1StartX, c1StartY, c1StartZ, c1EndX, c1EndY, c1EndZ))
return true;
if (pointIsInCubeArea(c2EndX, c2EndY, c2EndZ, c1StartX, c1StartY, c1StartZ, c1EndX, c1EndY, c1EndZ))
return true;
if (pointIsInCubeArea((c1StartX + c1EndX )/ 2, c1StartY, c1StartZ, c2StartX, c2StartY, c2StartZ, c2EndX, c2EndY, c2EndZ))
return true;
if (pointIsInCubeArea((c1StartX + c1EndX )/ 2, c1EndY, c1StartZ, c2StartX, c2StartY, c2StartZ, c2EndX, c2EndY, c2EndZ))
return true;
if (pointIsInCubeArea((c1StartX + c1EndX )/ 2, c1StartY, c1EndZ, c2StartX, c2StartY, c2StartZ, c2EndX, c2EndY, c2EndZ))
return true;
if (pointIsInCubeArea((c1StartX + c1EndX )/ 2, c1EndY, c1EndZ, c2StartX, c2StartY, c2StartZ, c2EndX, c2EndY, c2EndZ))
return true;
if (pointIsInCubeArea(c1StartX , (c1StartY + c1EndY) / 2, c1StartZ, c2StartX, c2StartY, c2StartZ, c2EndX, c2EndY, c2EndZ))
return true;
if (pointIsInCubeArea(c1StartX, (c1StartY + c1EndY) / 2, c1EndZ, c2StartX, c2StartY, c2StartZ, c2EndX, c2EndY, c2EndZ))
return true;
if (pointIsInCubeArea(c1EndX , (c1StartY + c1EndY) / 2, c1StartZ, c2StartX, c2StartY, c2StartZ, c2EndX, c2EndY, c2EndZ))
return true;
if (pointIsInCubeArea(c1EndX, (c1StartY + c1EndY) / 2, c1EndZ, c2StartX, c2StartY, c2StartZ, c2EndX, c2EndY, c2EndZ))
return true;
if (pointIsInCubeArea(c1StartX , c1StartY, (c1StartZ + c1EndZ) / 2, c2StartX, c2StartY, c2StartZ, c2EndX, c2EndY, c2EndZ))
return true;
if (pointIsInCubeArea(c1StartX, c1EndY, (c1StartZ + c1EndZ) / 2, c2StartX, c2StartY, c2StartZ, c2EndX, c2EndY, c2EndZ))
return true;
if (pointIsInCubeArea(c1EndX , c1StartY, (c1StartZ + c1EndZ) / 2, c2StartX, c2StartY, c2StartZ, c2EndX, c2EndY, c2EndZ))
return true;
if (pointIsInCubeArea(c1EndX, c1EndY, (c1StartZ + c1EndZ) / 2, c2StartX, c2StartY, c2StartZ, c2EndX, c2EndY, c2EndZ))
return true;
if (pointIsInCubeArea((c2StartX + c2EndX )/ 2, c2StartY, c2StartZ, c1StartX, c1StartY, c1StartZ, c1EndX, c1EndY, c1EndZ))
return true;
if (pointIsInCubeArea((c2StartX + c2EndX )/ 2, c2EndY, c2StartZ, c1StartX, c1StartY, c1StartZ, c1EndX, c1EndY, c1EndZ))
return true;
if (pointIsInCubeArea((c2StartX + c2EndX )/ 2, c2StartY, c2EndZ, c1StartX, c1StartY, c1StartZ, c1EndX, c1EndY, c1EndZ))
return true;
if (pointIsInCubeArea((c2StartX + c2EndX )/ 2, c2EndY, c2EndZ, c1StartX, c1StartY, c1StartZ, c1EndX, c1EndY, c1EndZ))
return true;
if (pointIsInCubeArea(c2StartX , (c2StartY + c2EndY) / 2, c2StartZ, c1StartX, c1StartY, c1StartZ, c1EndX, c1EndY, c1EndZ))
return true;
if (pointIsInCubeArea(c2StartX, (c2StartY + c2EndY) / 2, c2EndZ, c1StartX, c1StartY, c1StartZ, c1EndX, c1EndY, c1EndZ))
return true;
if (pointIsInCubeArea(c2EndX , (c2StartY + c2EndY) / 2, c2StartZ, c1StartX, c1StartY, c1StartZ, c1EndX, c1EndY, c1EndZ))
return true;
if (pointIsInCubeArea(c2EndX, (c2StartY + c2EndY) / 2, c2EndZ, c1StartX, c1StartY, c1StartZ, c1EndX, c1EndY, c1EndZ))
return true;
if (pointIsInCubeArea(c2StartX , c2StartY, (c2StartZ + c2EndZ) / 2, c1StartX, c1StartY, c1StartZ, c1EndX, c1EndY, c1EndZ))
return true;
if (pointIsInCubeArea(c2StartX, c2EndY, (c2StartZ + c2EndZ) / 2, c1StartX, c1StartY, c1StartZ, c1EndX, c1EndY, c1EndZ))
return true;
if (pointIsInCubeArea(c2EndX , c2StartY, (c2StartZ + c2EndZ) / 2, c1StartX, c1StartY, c1StartZ, c1EndX, c1EndY, c1EndZ))
return true;
if (pointIsInCubeArea(c2EndX, c2EndY, (c2StartZ + c2EndZ) / 2, c1StartX, c1StartY, c1StartZ, c1EndX, c1EndY, c1EndZ))
return true;
if (pointIsInCubeArea((c1StartX + c1EndX) / 2, (c1StartY + c1EndY) / 2, (c1StartZ + c1EndZ) / 2, c2StartX, c2StartY, c2StartZ, c2EndX, c2EndY, c2EndZ))
return true;
if (pointIsInCubeArea((c2StartX + c2EndX) / 2, (c2StartY + c2EndY) / 2, (c2StartZ + c2EndZ) / 2, c1StartX, c1StartY, c1StartZ, c1EndX, c1EndY, c1EndZ))
return true;
return false;
}
//判断该点是否在给定参数的立方体内
function pointIsInCubeArea(px, py, pz, startX, startY, startZ, endX, endY, endZ) {
local cubeCenterX = (startX + endX) / 2;
local cubeXLen = abs(startX - endX) / 2;
local cubeCenterY = (startY + endY) / 2;
local cubeYLen = abs(startY - endY) / 2;
local cubeCenterZ = (startZ + endZ) / 2;
local cubeZLen = abs(startZ - endZ) / 2;
if (abs(px - cubeCenterX) <= cubeXLen && abs(py - cubeCenterY) <= cubeYLen && abs(pz - cubeCenterZ) <= cubeZLen)
return true;
return false;
}
//判断(px,py)是否在这个四边形内如果在就返回true否则返回false,
//一定要注意1234的坐标必须能首尾组成四边形不能跳坐标否则判断会直接失效
function pointIsIn4PointArea(px, py, x1, y1, x2, y2, x3, y3, x4, y4) {
local area = get4PointArea(x1, y1, x2, y2, x3, y3, x4, y4);
local pointArea1 = get3PointArea(x1, y1, x2, y2, px, py);
local pointArea2 = get3PointArea(x2, y2, x3, y3, px, py);
local pointArea3 = get3PointArea(x3, y3, x4, y4, px, py);
local pointArea4 = get3PointArea(x4, y4, x1, y1, px, py);
if (abs(area - pointArea1 - pointArea2 - pointArea3 - pointArea4)< 10.0)
return true;
return false;
}
//获得给定4个点形成的四边形面积
function get4PointArea(x1, y1, x2, y2, x3, y3, x4, y4) {
local area1 = get3PointArea(x1, y1, x2, y2, x3, y3)
local area2 = get3PointArea(x2, y2, x3, y3, x4, y4)
return area1 + area2;
}
//获得给定3个点形成的三角形面积
function get3PointArea(x1, y1, x2, y2, x3, y3) {
return abs(x1 * (y2 - y3) + x2 * (y3 - y1) + x3 * (y1 - y2)) / 2;
/*
local l1 = sqrt(pow((x1- x2), 2) + pow((y1- y2), 2));
local l2 = sqrt(pow((x1- x3), 2) + pow((y1- y3), 2));
local l3 = sqrt(pow((x2- x3), 2) + pow((y2- y3), 2));
return sqrt((l1 + l2 + l3) * (l1 + l2- l3) * (l1- l2 + l3) * (l2 + l3- l1)) / 4;
*/
}
//获得该数的符号
function getSign(var) {
if (var< 0)
return 1;
else if (var > 0)
return -1;
return 0;
}
//简便性能高的开平方
function sqrt(sum) {
local i = (sum / 2).tofloat();
local isb = 0;
for (isb = 0; isb< 10; isb++) {
i = (i - ((i * i - sum) / (2 * i))).tofloat();
}
return i;
}
//四舍五入
function Round(var) {
local v =
var -
var.tointeger();
if (v< 0.5)
return var.tointeger();
return var.tointeger() + 1;
}
//currentRate 越接近maxRate ,返回值由sv越接近ev
function getUniformVelocity(sv, ev, currentRate, maxRate) {
local rate = currentRate.tofloat() / maxRate.tofloat();
local varyValue = ev - sv;
return sv + varyValue * rate;
}
function sq_GetAccel(sv, ev, currentRate, maxRate, increaseFeature) {
local rate = currentRate.tofloat() / maxRate.tofloat();
local varyValue = ev - sv;
local increaseRate = 1.0;
if (increaseFeature) {
increaseRate = pow(50, rate) / 50; //慢->快
} else {
increaseRate = pow(rate, 0.05);
}
return sv + varyValue * increaseRate;
}
function getMax(a, b) {
if (a< b)
return b;
return a;
}
function getMin(a, b) {
if (a > b)
return b;
return a;
}
//获得贝塞尔曲线(2阶)
function getBeizeri(var1, var2, p0, p1, p2, p3) {
local t = var1.tofloat() / var2.tofloat();
local t1 = 1.0 - t;
local v1 = t1 * t1 * t1;
local v2 = t1 * t1;
local v3 = t1;
local v4 = t * t * t;
local ret = p0 * v1;
ret = ret + 3.0 * p1 * t * v2;
ret = ret + 3.0 * p2 * t * t * v3;
ret = ret + p3 * v4;
return ret;
}
//获得贝塞尔曲线角度
function getBeizeriAngle(var1, var2, p0, p1, p2, p3) {
local t = var1.tofloat() / var2.tofloat();
local t1 = 1.0 - t;
local v1 = t1 * t1;
local v2 = t1;
local v3 = t1;
local v4 = t * t;
local ret = 2.0 * p0 * v1;
ret = ret + 6.0 * p1 * t * v2;
ret = ret + 6.0 * p2 * t * v3;
ret = ret + 2.0 * p3 * v4;
return ret;
}
}

View File

@@ -0,0 +1,73 @@
/*
文件名:PacketClass.nut
路径:BaseClass/PacketClass/PacketClass.nut
创建日期:2024-04-07 16:59
文件用途:数据包类
*/
class Packet extends Base_C_Object {
//传参就构造 不传就new一个新包
constructor(...) {
if (vargv.len() > 0) {
base.constructor(vargv[0]);
} else {
local Buf = Sq_New_Point(0x20000);
Sq_CallFunc(S_Ptr("0x858DD4C"), "void", ["pointer"], Buf);
base.constructor(Buf);
}
}
function Put_Header(a, b) {
Sq_CallFunc(S_Ptr("0x80CB8FC"), "int", ["pointer", "int", "int"], this.C_Object, a, b);
// Sq_Packet_Put_header(this.C_Object, a, b);
}
function Put_Byte(Value) {
Sq_CallFunc(S_Ptr("0x80CB920"), "int", ["pointer", "int"], this.C_Object, Value);
// Sq_Packet_Put_byte(this.C_Object, Value);
}
function Put_Short(Value) {
Sq_CallFunc(S_Ptr("0x80D9EA4"), "int", ["pointer", "int"], this.C_Object, Value);
// Sq_Packet_Put_short(this.C_Object, Value);
}
function Put_Int(Value) {
Sq_CallFunc(S_Ptr("0x80CB93C"), "int", ["pointer", "int"], this.C_Object, Value);
// Sq_Packet_Put_int(this.C_Object, Value);
}
function Put_Binary(Value) {
local StrPoint = Str_Ptr(Value);
Sq_CallFunc(S_Ptr("0x811DF08"), "int", ["pointer", "pointer", "int"], this.C_Object, StrPoint, Value.len());
// Sq_Packet_Put_binary(this.C_Object, Value);
}
function Put_BinaryEx(Str, Len) {
Sq_CallFunc(S_Ptr("0x811DF08"), "int", ["pointer", "pointer", "int"], this.C_Object, Str, Len);
//Sq_Packet_Put_binaryex(this.C_Object, Str, Len);
}
function Put_BinaryEx_M(Str, Len) {
// Sq_Packet_Put_binaryex(this.C_Object, Str, Len);
Sq_CallFunc(S_Ptr("0x811DF08"), "int", ["pointer", "pointer", "int"], this.C_Object, Str, Len);
}
function Put_Str(Str, Len) {
Sq_CallFunc(S_Ptr("0x81B73E4"), "int", ["pointer", "pointer", "int"], this.C_Object, Str, Len);
}
function Finalize(Value) {
Sq_Packet_Finalize(this.C_Object, Value);
}
function Send(SUser) {
Sq_Packet_Send(SUser.C_Object, this.C_Object);
}
function Delete() {
Sq_CallFunc(S_Ptr("0x858DE80"), "void", ["pointer"], this.C_Object);
Sq_Delete_Point(this.C_Object);
// Sq_Packet_Delete(this.C_Object);
}
}

View File

@@ -0,0 +1,82 @@
/*
文件名:PartyClass.nut
路径:BaseClass/PartyClass/PartyClass.nut
创建日期:2024-04-09 20:28
文件用途:Party类
*/
class Party extends Base_C_Object {
constructor(CObject) {
base.constructor(CObject);
}
//创建队伍
function Create(SUser) {
Sq_Party_CreateParty(C_Object, SUser.C_Object);
}
//给队伍加入玩家
function Join(SUser) {
Sq_Party_JoinParty(C_Object, SUser.C_Object);
}
//获取队长
function GetMaster() {
local Ret = Sq_CallFunc(S_Ptr("0x8145780"), "pointer", ["pointer"], this.C_Object);
if (Ret) {
local SUser = User(Ret);
if (SUser) return SUser;
}
return null;
}
//发送每个玩家的IP广播 因为组队时p2p
function SendIpInfo() {
Sq_Party_SendPartyIpInfo(C_Object);
}
//获取战斗对象
function GetBattleField() {
return BattleField(Sq_Party_GetBattle_Field(C_Object));
}
//获取玩家
function GetUser(Pos) {
local C_User = Sq_CallFunc(S_Ptr("0x08145764"), "pointer", ["pointer", "int"], this.C_Object, Pos);
if (C_User) {
return User(C_User);
}
return null;
}
//踢出玩家
function LeaveUser(SUser) {
Sq_CallFunc(S_Ptr("0x0859C114"), "int", ["pointer", "pointer", "int"], this.C_Object, SUser.C_Object, 2);
}
//从副本踢出玩家
function LeaveUserOnDgn(SUser) {
Sq_CallFunc(S_Ptr("0x085B2BAA"), "void", ["pointer", "pointer", "int", "int", "int"], this.C_Object, SUser.C_Object, 1, 0, 0);
}
//设置队伍可用复活币数量
function SetPartyMemberCoinLimit(Count) {
Sq_CallFunc(S_Ptr("0x085BE55A"), "pointer", ["pointer", "int"], this.C_Object, Count);
}
//遍历玩家并执行函数
function ForeachMember(Func) {
for (local i = 0; i< 4; i++) {
local SUser = GetUser(i);
if (SUser) {
Func(SUser, i);
}
}
}
//获取地下城清除状态
function Get_Dgn_Clear_State() {
return Sq_CallFunc(S_Ptr("0x0822D89C"), "int", ["pointer"], this.C_Object);
}
}

View File

@@ -0,0 +1,58 @@
/*
文件名:PvfItemClass.nut
路径:BaseClass/PvfClass/PvfItemClass.nut
创建日期:2024-04-26 19:28
文件用途:PVF item数据
*/
class PvfItem extends Base_C_Object {
Attribute = null;
constructor(CObject) {
base.constructor(CObject);
Attribute = Sq_Point2Blob(CObject, 600);
}
function Output() {
local Str = "[";
foreach(Value in Attribute) {
Str = format("%s%02X", Str, Value);
Str += ",";
}
Str += "]";
print(Str);
}
//获取编号
function GetIndex() {
Attribute.seek(1 * 4);
return Attribute.readn('i');
}
//获取可用等级
function GetUsableLevel() {
Attribute.seek(18 * 4);
return Attribute.readn('i');
}
//获取稀有度
function GetRarity() {
Attribute.seek(14 * 4);
return Attribute.readn('i');
}
//获取名字
function GetName() {
return Sq_GetNameByIdFromPvf(GetIndex());
}
//Public
function GetNameById(Id) {
return Sq_GetNameByIdFromPvf(Id);
}
//Public
function GetPvfItemById(Idx) {
local Ret = Sq_GetDataByIdFromPvf(Idx);
if (Ret) {
return PvfItem(Ret);
} else return null;
}
}

View File

@@ -0,0 +1,140 @@
/*
文件名:SocketBase.nut
路径:BaseClass/Socket/SocketBase.nut
创建日期:2024-04-10 10:13
文件用途:套接字连接
*/
//todo 公告接口
class Socket {
/*
* @函数作用: 发送包给插件网关
* @参数 Table
* @返回值
*/
function SendGateway(T) {
local str = Json.Encode(T);
if (PacketDebugModel) print("发送包给网关: " + str);
if (getroottable().rawin("Sq_SendPackToGateway")) Sq_SendPackToGateway(str);
}
}
//网关链接建立回调Map
if (!getroottable().rawin("OnGatewaySocketConnectFunc")) OnGatewaySocketConnectFunc <- {};
//插件网关建立连接时
function OnGatewaySocketConnect() {
print("############凌众插件连接建立############");
print("############凌众插件连接建立############");
print("############凌众插件连接建立############");
print("############凌众插件连接建立############");
local Jso = {
op = 10001,
channel = Sq_Game_GetConfig(),
type = 1
}
Socket.SendGateway(Jso);
foreach(value in OnGatewaySocketConnectFunc) {
value();
}
}
//网关包回调Map
if (!getroottable().rawin("GatewaySocketPackFuncMap")) GatewaySocketPackFuncMap <- {}
//插件网关收到包时
function OnGatewaySocketMsg(Msg) {
if (PacketDebugModel) print("收到网关包:" + Msg);
local Jso = Json.Decode(Msg);
if (!("op" in Jso)) {
if (PacketDebugModel) print("收到空op包");
return;
}
if (Jso.op in GatewaySocketPackFuncMap) {
GatewaySocketPackFuncMap[Jso.op](Jso);
} else {
// print(Msg);
local SUser = World.GetUserByUidCid(Jso.uid, Jso.cid);
if (SUser) {
local Pack = Packet();
Pack.Put_Header(1, 130);
Pack.Put_Byte(1);
Pack.Put_Int(Msg.len());
Pack.Put_Binary(Msg);
Pack.Finalize(true);
SUser.Send(Pack);
Pack.Delete();
}
}
}
//公用接口
/*
* @函数作用: 调用玩家移动城镇
* @参数 Jso 需要参数uid cid town regionId
* @返回值
*/
GatewaySocketPackFuncMap[20240408] <- function(Jso) {
local SUser = World.GetUserByUidCid(Jso.uid, Jso.cid);
if (SUser) {
World.MoveArea(SUser, Jso.town, Jso.regionId, Jso.X, Jso.Y);
}
}
/*
* @函数作用: 让指定玩家组队并进入副本
* @参数 Jso 需要参数uid cid Member 最外层uid cid 确定队长 Member 里面是一个uid 和 cid 信息对象的List 注意队长不要放进去
* @返回值
*/
GatewaySocketPackFuncMap[20240416] <- function(Jso) {
local SUser = World.GetUserByUidCid(Jso.uid, Jso.cid);
if (SUser) {
local Gm = GameManager();
local SParty = Gm.GetParty();
SParty.Create(SUser);
foreach(_Index, PlayerInfo in Jso.Member) {
local UserBuf = World.GetUserByUidCid(PlayerInfo.uid, PlayerInfo.cid);
if (UserBuf) {
SParty.Join(UserBuf);
}
}
SParty.SendIpInfo();
World.SendPartyInfoToAll(SParty);
if (Jso.map != 0) {
local T = {
op = 2024041602,
map = Jso.map
}
SUser.SendJso(T);
}
}
}
/***********************************************
**************** ****************
************************************************/
//客户端包回调Map
if (!getroottable().rawin("ClientSocketPackFuncMap")) ClientSocketPackFuncMap <- {}
//收到来自客户端的包 只有130
function OnClientSocketMsg(C_User, C_Pack_Str) {
if (PacketDebugModel) print("收到客户端包: " + C_Pack_Str);
local Jso = Json.Decode(C_Pack_Str);
if (Jso.op in ClientSocketPackFuncMap) {
local SUser = User(C_User);
ClientSocketPackFuncMap[Jso.op](SUser, Jso);
} else {
local SUser = User(C_User);
if (SUser) {
Jso.uid <- SUser.GetUID();
Jso.cid <- SUser.GetCID();
Socket.SendGateway(Jso);
}
}
}

View File

@@ -0,0 +1,522 @@
class User extends Base_C_Object {
constructor(gObject) {
base.constructor(gObject);
}
//获得当前区域
//@param b boolean
//@return integer
function GetArea(b) {
return Sq_CUser_GetAreaIndex(this.C_Object, b);
}
//获得当前区域位置
//@return integer, integer
function GetAreaPos() {
return {
X = Sq_CUser_GetPosX(this.C_Object),
Y = Sq_CUser_GetPosY(this.C_Object)
};
}
//获得朝向
//@return integer, integer
function GetDirections() {
return Sq_CUser_Direction(this.C_Object);
}
//获得可见values
//@return integer, integer
function GetVisibleValues() {
return Sq_CUser_GetVisibleValues(this.C_Object);
}
//获得当前城镇位置
//@return integer, integer, integer, integer @城镇, 区域, X, Y
function GetLocation() {
return {
Pos = this.GetAreaPos(),
Town = Sq_CUser_GetTownIndex(this.C_Object),
Area = Sq_CUser_GetAreaIndex(this.C_Object)
};
}
//账号状态
//@return integer @after login >= 3
function GetState() {
return Sq_CUser_GetState(this.C_Object);
}
//角色数量
//@return integer
function GetCharacCount() {
return Sq_CUser_GetCharacCount(this.C_Object);
}
//账号ID
//@return integer
function GetUID() {
return Sq_CUser_GetAccId(this.C_Object);
}
//唯一ID
//@return integer
function GetUniqueId() {
return Sq_CUser_GetUniqueId(this.C_Object);
}
//角色ID
//@return integer
function GetCID() {
return Sq_CUser_GetCharacNo(this.C_Object);
}
//角色职业
//@return integer
function GetCharacJob() {
return Sq_CUser_GetCharacJob(this.C_Object);
}
//角色名称
//@return string
function GetCharacName() {
return Sq_CUser_GetCharacName(this.C_Object);
}
//角色等级
//@return integer
function GetCharacLevel() {
return Sq_CUser_GetCharacLevel(this.C_Object);
}
//设置角色等级
//@param new_level integer
//@return boolean
function SetCharacLevel(new_level) {
Sq_CUser_ChangeGmQuestFlag(this.C_Object, 1);
Sq_CallFunc(S_Ptr("0x0858EFDE"), "int", ["pointer", "pointer", "int"], S_Ptr("0x0"), this.C_Object, new_level);
Sq_CUser_ChangeGmQuestFlag(this.C_Object, 0);
}
//角色转职职业
//@return integer
function GetCharacGrowType() {
return Sq_CUser_GetCharacGrowType(this.C_Object);
}
//角色觉醒职业
//@return integer
function GetCharacSecondGrowType() {
return Sq_CUser_GetCharacSecondGrowType(this.C_Object);
}
//更改转职职业 转职职业 是否觉醒
function ChangeGrowType(GrowType, IsAwa) {
Sq_CUser_ChangeGrowType(this.C_Object, GrowType, IsAwa);
}
//已用疲劳值
//@return integer
function GetFatigue() {
return Sq_CUser_GetFatigue(this.C_Object);
}
//最大疲劳值
//@return integer
function GetMaxFatigue() {
return Sq_CUser_GetMaxFatigue(this.C_Object);
}
//获取背包
//@return integer
function GetInven() {
local P = Sq_Inven_GetInven(this.C_Object);
if (P) {
return Inven(P, this);
}
return null;
}
//踢人
//@param src integer @渠道
//@param p2 integer
//@param p3 integer
//@return integer @错误码?
function Kick(...) {
local src;
local p2;
local p3;
for (local i = 0; i< vargv.len(); i++) {
if (i == 0) src = vargv[i];
if (i == 1) p2 = vargv[i];
if (i == 2) p3 = vargv[i];
}
return Sq_CUser_DisConnSig(this.C_Object, src ? src : 0, p2 ? p2 : 0, p3 ? p3 : 0)
}
//踢人
//@param err @错误号
//@return integer
function DisConn(err) {
return this.Kick(10, 1, err ? err : 1)
}
//当前小队/副本
//@return CParty
function GetParty() {
local Ret = Sq_CUser_GetParty(this.C_Object);
if (Ret) {
return Party(Ret);
}
return null;
}
//是否在领主塔
//@return boolean
function CheckInBossTower() {
return (Sq_CUser_CheckInBossTower(this.C_Object) == 1);
}
//是否在龙之路
//@return boolean
function CheckInBlueMarble() {
return (Sq_CUser_CheckInBlueMarble(this.C_Object) == 1);
}
//是否开启GM权限
//@return boolean
function IsGmMode() {
return (Sq_CUser_IsGmMode(this.C_Object) != 0);
}
//获取账号上次退出游戏的时间
function GetCurCharacLastPlayTick() {
return Sq_CUser_GetCurCharacLastPlayTick(this.C_Object);
}
//获取账号本次登录游戏的时间
function GetCurCharacLoginTick() {
return Sq_CallFunc(S_Ptr("0x822F692"), "int", ["pointer"], this.C_Object);
}
//获得公网地址
//@return integer
function GetIpAddress() {
return Sq_CallFunc(S_Ptr("0x84EC90A"), "int", ["pointer"], this.C_Object);
}
//发包
function Send(SPacket) {
Sq_Packet_Send(this.C_Object, SPacket.C_Object);
}
//发送自定义包
function SendJso(Jso) {
local Str = Json.Encode(Jso);
if (PacketDebugModel) print("发送包给客户端: " + Str);
local Pack = Packet();
Pack.Put_Header(1, 130);
Pack.Put_Byte(1);
Pack.Put_Int(Str.len());
Pack.Put_Binary(Str);
Pack.Finalize(true);
Send(Pack);
Pack.Delete();
}
//发送消息包
function SendNotiPacket(Type1, Type2, Type3) {
Sq_CUser_SendNotiPacket(this.C_Object, Type1, Type2, Type3);
}
//获取技能树
function GetSkillW() {
return Sq_CUser_GetSkillW(this.C_Object);
}
//重置技能树 转职编号 是否觉醒
function InitSkillW(GrowType, IsAwa) {
Sq_CUser_InitSkillW(Sq_CUser_GetSkillW(this.C_Object), GrowType, IsAwa);
}
//发送公告消息
function SendNotiPacketMessage(String, Type) {
local Pack = Packet();
Pack.Put_Header(0, 12);
Pack.Put_Byte(Type);
Pack.Put_Short(0);
Pack.Put_Byte(0);
Pack.Put_Int(String.len());
Pack.Put_Binary(String);
Pack.Finalize(true);
this.Send(Pack);
Pack.Delete();
}
//发送公告消息 字符串数组
function SendNotiForColorPacketMessage(StringArr, Type) {
local ColorArr = [];
local SendStrBlob = blob(1);
SendStrBlob.writen(0xc2, 'c');
SendStrBlob.writen(0x80, 'c');
foreach(sobj in StringArr) {
local StrPoint = Str_Ptr(sobj[0]);
local StrPointB = Sq_Point2Blob(StrPoint, sobj[0].len());
if (sobj[1]) {
SendStrBlob.writen(0xc2, 'c');
SendStrBlob.writen(0x80, 'c');
SendStrBlob.writeblob(StrPointB);
SendStrBlob.writen(0xc2, 'c');
SendStrBlob.writen(0x80, 'c');
local ColorBlob = blob(104);
for (local i = 0; i< 3; i++) {
ColorBlob.writen(sobj[2][i], 'c');
}
for (local i = 0; i< 101; i++) {
ColorBlob.writen(0xff, 'c');
}
local ColorPoint = Sq_New_Point(104);
Sq_WriteBlobToAddress(ColorPoint, ColorBlob);
ColorArr.append(ColorPoint);
} else {
SendStrBlob.writeblob(StrPointB);
}
}
local SendStrLen = SendStrBlob.len();
local SendStrPoint = Sq_New_Point(SendStrLen);
Sq_WriteBlobToAddress(SendStrPoint, SendStrBlob);
local Pack = Packet();
Pack.Put_Header(0, 370);
Pack.Put_Byte(Type);
Pack.Put_Short(0);
Pack.Put_Byte(3);
Pack.Put_Int(SendStrLen);
Pack.Put_BinaryEx(SendStrPoint, SendStrLen);
Pack.Put_Byte(ColorArr.len());
foreach(color in ColorArr) {
Pack.Put_BinaryEx(color, 3);
}
Pack.Finalize(true);
Send(Pack);
Pack.Delete();
SendItemSpace(0);
Sq_Delete_Point(SendStrPoint);
for (local i = 0; i< ColorArr.len(); i++) {
Sq_Delete_Point(ColorArr[i]);
}
}
//发送公告消息 字符串数组 带ID
function SendNotiForColorAIdPacketMessage(StringArr, Type) {
local ColorArr = [];
local SendStrBlob = blob(1);
SendStrBlob.writen(0xc2, 'c');
SendStrBlob.writen(0x80, 'c');
foreach(sobj in StringArr) {
local StrPoint = Str_Ptr(sobj[0]);
local StrPointB = Sq_Point2Blob(StrPoint, sobj[0].len());
if (sobj[1]) {
SendStrBlob.writen(0xc2, 'c');
SendStrBlob.writen(0x80, 'c');
SendStrBlob.writeblob(StrPointB);
SendStrBlob.writen(0xc2, 'c');
SendStrBlob.writen(0x80, 'c');
local ColorBlob = blob(104);
for (local i = 0; i< 3; i++) {
ColorBlob.writen(sobj[2][i], 'c');
}
if (sobj[3]) {
ColorBlob.seek(4);
ColorBlob.writen(sobj[3], 'i');
} else {
for (local i = 0; i< 101; i++) {
ColorBlob.writen(0xff, 'c');
}
}
local ColorPoint = Sq_New_Point(104);
Sq_WriteBlobToAddress(ColorPoint, ColorBlob);
ColorArr.append(ColorPoint);
} else {
SendStrBlob.writeblob(StrPointB);
}
}
local SendStrLen = SendStrBlob.len();
local SendStrPoint = Sq_New_Point(SendStrLen);
Sq_WriteBlobToAddress(SendStrPoint, SendStrBlob);
local Pack = Packet();
Pack.Put_Header(0, 370);
Pack.Put_Byte(Type);
Pack.Put_Short(0);
Pack.Put_Byte(3);
Pack.Put_Int(SendStrLen);
Pack.Put_BinaryEx(SendStrPoint, SendStrLen);
Pack.Put_Byte(ColorArr.len());
foreach(color in ColorArr) {
Pack.Put_BinaryEx(color, 104);
}
Pack.Finalize(true);
Send(Pack);
Pack.Delete();
SendItemSpace(0);
Sq_Delete_Point(SendStrPoint);
for (local i = 0; i< ColorArr.len(); i++) {
Sq_Delete_Point(ColorArr[i]);
}
}
//调试信息包
function Debug(Any) {
local Time = date();
local TStr = format("[%d年%d月%d日%d时%d分%d秒]\n", Time.year, Time.month, Time.day, Time.hour, Time.min, Time.sec);
SendNotiPacketMessage(TStr + Any.tostring(), 8);
}
//发送道具
function GiveItem(ItemId, ItemCount) {
//如果开了调试
if ("DebugModelFlag" in getroottable()) {
local Flag = PvfItem.GetPvfItemById(ItemId);
if (!Flag) {
print("未找到Pvf道具: " + ItemId);
return null;
}
}
local Info = Sq_CUser_GiveUserItem(this.C_Object, ItemId, ItemCount);
if (Info) { //发送成功就刷新背包
Sq_CUser_SendUpdateItemList(this.C_Object, 1, Info[0], Info[1]);
return Info;
} else return null;
}
//发送道具 如果背包满则发送邮件
function GiveItemEx(GiveTab) {
local mitems = {};
foreach(i, v in GiveTab) {
local Ret = GiveItem(v.id, v.count);
if (!Ret) mitems[v.id] <- v.count;
}
if (mitems.len() > 0) {
SendMail(mitems, {
Title = "系统",
Text = "由于你的包裹已满, 请留出足够的空间来接收道具."
})
}
}
//更新背包栏
function SendItemSpace(ItemSpace) {
Sq_CallFunc(S_Ptr("0x865DB6C"), "int", ["pointer", "int"], this.C_Object, ItemSpace);
}
//更新道具信息
function SendUpdateItemList(Type, ItemSpace, Slot) {
Sq_CUser_SendUpdateItemList(this.C_Object, Type, ItemSpace, Slot);
}
//发送系统邮件
function SendMail(ItemList, ...) {
local SGold = 0;
local STitle = "GM邮件";
local SText = "这是Gm给您发送的邮件";
if (vargv.len() > 0) {
local T = vargv[0];
if ("Gold" in T) SGold = T.Gold;
if ("Title" in T) STitle = T.Title;
if ("Text" in T) SText = T.Text;
}
Sq_CUser_SendMail(GetCID(), ItemList, SGold, STitle, SText);
}
//无条件完成指定任务并领取奖励
function ClearQuest_Gm(QuestId) {
Sq_CUser_ChangeGmQuestFlag(this.C_Object, 1);
Sq_CUser_QuestAction(this.C_Object, 33, QuestId, 0, 0);
Sq_CUser_QuestAction(this.C_Object, 35, QuestId, 0, 0);
Sq_CUser_QuestAction(this.C_Object, 36, QuestId, -1, 1);
Sq_CUser_RefreshLastQuestTime(this.C_Object);
Sq_CUser_ChangeGmQuestFlag(this.C_Object, 0);
}
//充值点券
function RechargeCera(Amount) {
Sq_CUser_RechargeCoupons(this.C_Object, Amount);
}
//获取点券
function GetCera() {
return Sq_CallFunc(S_Ptr("0x080FDF7A"), "int", ["pointer"], this.C_Object);
}
//充值代币券
function RechargeCeraPoint(Amount) {
Sq_CUser_RechargeCouponsPoint(this.C_Object, Amount);
}
//获取代币券
function GetCeraPoint() {
return Sq_CallFunc(S_Ptr("0x08692af6"), "int", ["pointer"], this.C_Object);
}
//充值金币
function RechargeMoney(Amount) {
Sq_CallFunc(S_Ptr("0x84FF29C"), "int", ["pointer", "int", "int", "int", "int"], Sq_CallFunc(S_Ptr("0x80DA28E"), "pointer", ["pointer"], this.C_Object), Amount, 0, 0, 0);
}
//充值胜点
function RechargeWinPoint(Amount) {
return Sq_CallFunc(S_Ptr("0x0864fd2c"), "int", ["pointer", "int", "int"], this.C_Object, Amount, 6);
}
//获取胜点
function GetWinPoint() {
return Sq_CallFunc(S_Ptr("0x0817a17c"), "int", ["pointer"], this.C_Object);
}
//获取复活币
function GetCoin() {
local Count = Sq_CallFunc(S_Ptr("0x086966b4"), "int", ["pointer"], this.C_Object) + Sq_CallFunc(S_Ptr("0x086966e0"), "int", ["pointer"], this.C_Object) + Sq_CallFunc(S_Ptr("0x0869670c"), "int", ["pointer"], this.C_Object);
return Count;
}
//离开队伍
function LeaveParty() {
local PartyObj = GetParty();
if (PartyObj) {
PartyObj.LeaveUser(this);
}
}
//放弃副本
function GiveupDgn() {
local PartyObj = GetParty();
if (PartyObj) {
PartyObj.LeaveUserOnDgn(this);
}
}
//设置玩家坐标
function SetPosition(Xpos, Ypos, Direction) {
Sq_CallFunc(S_Ptr("0x082F0E2A"), "pointer", ["pointer", "int", "int", "short"], this.C_Object, Xpos, Ypos, Direction);
}
//获取玩家任务信息
function GetQuest() {
return Sq_CallFunc(S_Ptr("0x814AA5E"), "pointer", ["pointer"], this.C_Object);
}
//获取玩家账号金库
function GetAccountCargo() {
local Ret = Sq_CallFunc(S_Ptr("0x0822fc22"), "pointer", ["pointer"], this.C_Object);
if (Ret) return AccountCargo(Ret, this);
else return null;
}
}

View File

@@ -0,0 +1,207 @@
/*
文件名:WorldClass.nut
路径:BaseClass/WorldClass/WorldClass.nut
创建日期:2024-04-07 21:25
文件用途:游戏世界类
*/
class World {
constructor() {}
// 根据UID获取Session
function GetSessionByUid(Uid) {
return Sq_GameWorld_GetSessionByUid(Sq_Get_GameWorld(), Uid);
}
// 根据Session获取玩家
function GetUserBySession(Session) {
local CUser = Sq_GameWorld_GetUserBySession(Sq_Get_GameWorld(), Session);
if (CUser)
return User(CUser);
else
return null;
}
// 根据UID获取玩家
function GetUserByUid(Uid) {
local CUser = Sq_GameWorld_GetUserByUid(Sq_Get_GameWorld(), Uid);
if (CUser)
return User(CUser);
else
return null;
}
// 根据名字获取玩家
function GetUserByName(Name) {
local CUser = Sq_GameWorld_GetUserByName(Sq_Get_GameWorld(), Name);
if (CUser)
return User(CUser);
else
return null;
}
// 获取玩家数量
function GetUserCount() {
return Sq_GameWorld_GetUserCount(Sq_Get_GameWorld());
}
// 给所有玩家发包
function SendAll(Pack) {
Sq_GameWorld_SendAll(Sq_Get_GameWorld(), Pack.C_Object);
}
// 给所有玩家发送公告
function SendNotiPacketMessage(String, Type) {
local Pack = Packet();
Pack.Put_Header(0, 12);
Pack.Put_Byte(Type);
Pack.Put_Short(0);
Pack.Put_Byte(0);
Pack.Put_Int(String.len());
Pack.Put_Binary(String);
Pack.Finalize(true);
World.SendAll(Pack)
Pack.Delete();
}
//发送公告消息 字符串数组
function SendNotiForColorPacketMessage(StringArr, Type) {
local ColorArr = [];
local SendStrBlob = blob(1);
SendStrBlob.writen(0xc2, 'c');
SendStrBlob.writen(0x80, 'c');
foreach(sobj in StringArr) {
local StrPoint = Str_Ptr(sobj[0]);
local StrPointB = Sq_Point2Blob(StrPoint, sobj[0].len());
if (sobj[1]) {
SendStrBlob.writen(0xc2, 'c');
SendStrBlob.writen(0x80, 'c');
SendStrBlob.writeblob(StrPointB);
SendStrBlob.writen(0xc2, 'c');
SendStrBlob.writen(0x80, 'c');
local ColorBlob = blob(104);
for (local i = 0; i< 3; i++) {
ColorBlob.writen(sobj[2][i], 'c');
}
for (local i = 0; i< 101; i++) {
ColorBlob.writen(0xff, 'c');
}
local ColorPoint = Sq_New_Point(104);
Sq_WriteBlobToAddress(ColorPoint, ColorBlob);
ColorArr.append(ColorPoint);
} else {
SendStrBlob.writeblob(StrPointB);
}
}
local SendStrLen = SendStrBlob.len();
local SendStrPoint = Sq_New_Point(SendStrLen);
Sq_WriteBlobToAddress(SendStrPoint, SendStrBlob);
local Pack = Packet();
Pack.Put_Header(0, 370);
Pack.Put_Byte(Type);
Pack.Put_Short(0);
Pack.Put_Byte(3);
Pack.Put_Int(SendStrLen);
Pack.Put_BinaryEx(SendStrPoint, SendStrLen);
Pack.Put_Byte(ColorArr.len());
foreach(color in ColorArr) {
Pack.Put_BinaryEx(color, 104);
}
Pack.Finalize(true);
World.SendAll(Pack)
Pack.Delete();
// SendItemSpace(0);
Sq_Delete_Point(SendStrPoint);
for (local i = 0; i< ColorArr.len(); i++) {
Sq_Delete_Point(ColorArr[i]);
}
}
//发送公告消息 字符串数组 带ID
function SendNotiForColorAIdPacketMessage(StringArr, Type) {
local ColorArr = [];
local SendStrBlob = blob(1);
SendStrBlob.writen(0xc2, 'c');
SendStrBlob.writen(0x80, 'c');
foreach(sobj in StringArr) {
local StrPoint = Str_Ptr(sobj[0]);
local StrPointB = Sq_Point2Blob(StrPoint, sobj[0].len());
if (sobj[1]) {
SendStrBlob.writen(0xc2, 'c');
SendStrBlob.writen(0x80, 'c');
SendStrBlob.writeblob(StrPointB);
SendStrBlob.writen(0xc2, 'c');
SendStrBlob.writen(0x80, 'c');
local ColorBlob = blob(104);
for (local i = 0; i< 3; i++) {
ColorBlob.writen(sobj[2][i], 'c');
}
if (sobj[3]) {
ColorBlob.seek(4);
ColorBlob.writen(sobj[3], 'i');
} else {
for (local i = 0; i< 101; i++) {
ColorBlob.writen(0xff, 'c');
}
}
local ColorPoint = Sq_New_Point(104);
Sq_WriteBlobToAddress(ColorPoint, ColorBlob);
ColorArr.append(ColorPoint);
} else {
SendStrBlob.writeblob(StrPointB);
}
}
local SendStrLen = SendStrBlob.len();
local SendStrPoint = Sq_New_Point(SendStrLen);
Sq_WriteBlobToAddress(SendStrPoint, SendStrBlob);
local Pack = Packet();
Pack.Put_Header(0, 370);
Pack.Put_Byte(Type);
Pack.Put_Short(0);
Pack.Put_Byte(3);
Pack.Put_Int(SendStrLen);
Pack.Put_BinaryEx(SendStrPoint, SendStrLen);
Pack.Put_Byte(ColorArr.len());
foreach(color in ColorArr) {
Pack.Put_BinaryEx(color, 104);
}
Pack.Finalize(true);
World.SendAll(Pack)
Pack.Delete();
// SendItemSpace(0);
Sq_Delete_Point(SendStrPoint);
for (local i = 0; i< ColorArr.len(); i++) {
Sq_Delete_Point(ColorArr[i]);
}
}
//通过UID和CID获取玩家
function GetUserByUidCid(Uid, Cid) {
local SUser = GetUserByUid(Uid);
if (SUser) {
if (SUser.GetState() >= 3) {
if (SUser.GetCID() == Cid) {
return SUser;
}
}
}
return null;
}
//指定角色移动区域
function MoveArea(SUser, TownIndex, AreaIndex, Xpos, Ypos) {
Sq_GameWorld_MoveArea(Sq_Get_GameWorld(), SUser.C_Object, TownIndex, AreaIndex, Xpos, Ypos);
}
//副本进出
function SendDungeonInOut(SUser, Index, Model) {
Sq_GameWorld_SendDungeonInOut(Sq_Get_GameWorld(), SUser.C_Object, Index, Model);
}
//给所有玩家发送队伍包
function SendPartyInfoToAll(Party) {
Sq_GameWorld_SendPartyInfoToAll(Sq_Get_GameWorld(), Party.C_Object);
}
}