1111
This commit is contained in:
30
Dps_A/BaseClass/AccountCargoClass/AccountCargoClass.nut
Normal file
30
Dps_A/BaseClass/AccountCargoClass/AccountCargoClass.nut
Normal 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);
|
||||
}
|
||||
}
|
||||
12
Dps_A/BaseClass/BaseInfoClass/BaseBindenvClass.nut
Normal file
12
Dps_A/BaseClass/BaseInfoClass/BaseBindenvClass.nut
Normal 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);
|
||||
}
|
||||
}
|
||||
7
Dps_A/BaseClass/BaseObjectClass/BaseObjectClass.nut
Normal file
7
Dps_A/BaseClass/BaseObjectClass/BaseObjectClass.nut
Normal file
@@ -0,0 +1,7 @@
|
||||
class Base_C_Object {
|
||||
C_Object = null;
|
||||
|
||||
constructor(gObject) {
|
||||
this.C_Object = gObject;
|
||||
}
|
||||
}
|
||||
34
Dps_A/BaseClass/BattleFieldClass/BattleFieldClass.nut
Normal file
34
Dps_A/BaseClass/BattleFieldClass/BattleFieldClass.nut
Normal 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'))
|
||||
}
|
||||
}
|
||||
30
Dps_A/BaseClass/DungeonClass/DungeonClass.nut
Normal file
30
Dps_A/BaseClass/DungeonClass/DungeonClass.nut
Normal 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);
|
||||
}
|
||||
}
|
||||
18
Dps_A/BaseClass/GameManagerClass/GameManagerClass.nut
Normal file
18
Dps_A/BaseClass/GameManagerClass/GameManagerClass.nut
Normal 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);
|
||||
}
|
||||
}
|
||||
75
Dps_A/BaseClass/InvenClass/InvenClass.nut
Normal file
75
Dps_A/BaseClass/InvenClass/InvenClass.nut
Normal 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;
|
||||
}
|
||||
}
|
||||
138
Dps_A/BaseClass/ItemClass/ItemClass.nut
Normal file
138
Dps_A/BaseClass/ItemClass/ItemClass.nut
Normal 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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
30
Dps_A/BaseClass/JsonClass/Json.nut
Normal file
30
Dps_A/BaseClass/JsonClass/Json.nut
Normal 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);
|
||||
}
|
||||
}
|
||||
702
Dps_A/BaseClass/JsonClass/JsonClass.nut
Normal file
702
Dps_A/BaseClass/JsonClass/JsonClass.nut
Normal 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;
|
||||
}
|
||||
}
|
||||
393
Dps_A/BaseClass/MathClass/MathCalss.nut
Normal file
393
Dps_A/BaseClass/MathClass/MathCalss.nut
Normal 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,
|
||||
//一定要注意,1,2,3,4的坐标必须能首尾组成四边形,不能跳坐标!!!!否则判断会直接失效!!!
|
||||
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;
|
||||
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
73
Dps_A/BaseClass/PacketClass/PacketClass.nut
Normal file
73
Dps_A/BaseClass/PacketClass/PacketClass.nut
Normal 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);
|
||||
}
|
||||
}
|
||||
82
Dps_A/BaseClass/PartyClass/PartyClass.nut
Normal file
82
Dps_A/BaseClass/PartyClass/PartyClass.nut
Normal 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);
|
||||
}
|
||||
}
|
||||
58
Dps_A/BaseClass/PvfClass/PvfItemClass.nut
Normal file
58
Dps_A/BaseClass/PvfClass/PvfItemClass.nut
Normal 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;
|
||||
}
|
||||
}
|
||||
140
Dps_A/BaseClass/Socket/SocketBase.nut
Normal file
140
Dps_A/BaseClass/Socket/SocketBase.nut
Normal 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);
|
||||
}
|
||||
}
|
||||
}
|
||||
522
Dps_A/BaseClass/UserClass/UserClass.nut
Normal file
522
Dps_A/BaseClass/UserClass/UserClass.nut
Normal 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;
|
||||
}
|
||||
}
|
||||
207
Dps_A/BaseClass/WorldClass/WorldClass.nut
Normal file
207
Dps_A/BaseClass/WorldClass/WorldClass.nut
Normal 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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user