更换国内服务器
This commit is contained in:
@@ -234,20 +234,20 @@ class EquimentUseJewel {
|
||||
}
|
||||
|
||||
|
||||
HackReturnAddSocketToAvatarFalg = null;
|
||||
|
||||
|
||||
function HackReturnAddSocketToAvatar(Code) {
|
||||
//标记flag
|
||||
HackReturnAddSocketToAvatarFalg = Code;
|
||||
|
||||
Cb_PacketBuf_get_short_Leave_Func.EquimentUseJewel <- function(args) {
|
||||
Cb_PacketBuf_get_short_Leave_Func.rawdelete("EquimentUseJewel");
|
||||
return 0;
|
||||
}.bindenv(this);
|
||||
function HackAddSocketToAvatarLogic(Flag) {
|
||||
if (Flag) {
|
||||
Sq_WriteByteArr(S_Ptr("821A449"), [0x90,0x90]);
|
||||
Sq_WriteByteArr(S_Ptr("0x821A44B"), array(36,0x90));
|
||||
} else {
|
||||
Sq_WriteByteArr(S_Ptr("821A449"), [0x74,0x2B]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
function FixFunction() {
|
||||
//称号回包
|
||||
Cb_CTitleBook_putItemData_Leave_Func.EquimentUseJewel <- function(args) {
|
||||
@@ -270,7 +270,9 @@ class EquimentUseJewel {
|
||||
//装备开孔
|
||||
Cb_AddSocketToAvatar_Enter_Func.EquimentUseJewel <- function(args) {
|
||||
local SUser = User(args[1]);
|
||||
local Pack = Packet(args[2]);
|
||||
local PackCopyBuffer = Memory.alloc(10001);
|
||||
Memory.copy(PackCopyBuffer, NativePointer(args[2]), 1000);
|
||||
local Pack = Packet(PackCopyBuffer.C_Object);
|
||||
local equ_slot = Pack.GetShort();
|
||||
local equitem_id = Pack.GetInt();
|
||||
local sta_slot = Pack.GetShort();
|
||||
@@ -281,13 +283,15 @@ class EquimentUseJewel {
|
||||
equ_slot = equ_slot - 57;
|
||||
local C_PacketBuf = api_PacketBuf_get_buf(args[2]) //获取原始封包数据
|
||||
C_PacketBuf.add(0).writeShort(equ_slot) //修改掉装备位置信息 时装类镶嵌从57开始。
|
||||
|
||||
//执行原逻辑
|
||||
return null;
|
||||
}
|
||||
//如果已开启镶嵌槽则不执行
|
||||
local equ_id = NativePointer(inven_item.C_Object).add(25).readU32();
|
||||
if (api_exitjeweldata(equ_id)) {
|
||||
HackReturnAddSocketToAvatar(0x13);
|
||||
CUser_SendCmdErrorPacket(SUser, 209, 19);
|
||||
HackAddSocketToAvatarLogic(true);
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -296,11 +300,13 @@ class EquimentUseJewel {
|
||||
|
||||
if (ItemType == 10) {
|
||||
SUser.SendNotiBox("装备为武器类型,不支持打孔!", 1)
|
||||
HackReturnAddSocketToAvatar(0x0);
|
||||
CUser_SendCmdErrorPacket(SUser, 209, 0);
|
||||
HackAddSocketToAvatarLogic(true);
|
||||
return null;
|
||||
} else if (ItemType == 11) {
|
||||
SUser.SendNotiBox("装备为称号类型,不支持打孔!", 1)
|
||||
HackReturnAddSocketToAvatar(0x0);
|
||||
CUser_SendCmdErrorPacket(SUser, 209, 0);
|
||||
HackAddSocketToAvatarLogic(true);
|
||||
return null;
|
||||
}
|
||||
|
||||
@@ -321,19 +327,12 @@ class EquimentUseJewel {
|
||||
Pack.Finalize(true);
|
||||
SUser.Send(Pack);
|
||||
Pack.Delete();
|
||||
HackReturnAddSocketToAvatar(0x0);
|
||||
HackAddSocketToAvatarLogic(true);
|
||||
return null;
|
||||
}.bindenv(this);
|
||||
|
||||
Cb_AddSocketToAvatar_Leave_Func.EquimentUseJewel <- function(args) {
|
||||
//跳的错误返回0 正常调用的话不处理返回值
|
||||
if (HackReturnAddSocketToAvatarFalg != null) {
|
||||
local SUser = User(args[1]);
|
||||
// SUser.SendItemSpace(0);
|
||||
CUser_SendCmdErrorPacket(SUser, 209, HackReturnAddSocketToAvatarFalg);
|
||||
HackReturnAddSocketToAvatarFalg = null;
|
||||
return 0;
|
||||
}
|
||||
HackAddSocketToAvatarLogic(false);
|
||||
return null;
|
||||
}.bindenv(this);
|
||||
|
||||
|
||||
@@ -15,78 +15,103 @@
|
||||
创建日期:2025-03-25 14:42
|
||||
文件用途:一键入库
|
||||
*/
|
||||
//获取金库
|
||||
function User::GetCharacCargo() {
|
||||
return Sq_CallFunc(S_Ptr("0x008151A94"), "pointer", ["pointer"], this.C_Object);
|
||||
}
|
||||
|
||||
//检查金库是否有指定ID道具
|
||||
function CharacCargo_Check_Item_Exist(Cargo_C_Object, ItemId) {
|
||||
return Sq_CallFunc(S_Ptr("0x0850BC14"), "int", ["pointer", "int"], Cargo_C_Object, ItemId);
|
||||
}
|
||||
|
||||
//检查物上限品堆叠
|
||||
function Check_Item_Stack(ItemId, ItemCount) {
|
||||
return Sq_CallFunc(S_Ptr("0x08501A79"), "int", ["int", "int"], ItemId, ItemCount);
|
||||
}
|
||||
|
||||
//将物品存入仓库
|
||||
function CharacCargo_Insert_Item(Cargo_C_Object, Item_C_Object) {
|
||||
return Sq_CallFunc(S_Ptr("0x0850B400"), "int", ["pointer", "pointer"], Cargo_C_Object, Item_C_Object);
|
||||
}
|
||||
|
||||
Gm_InputFunc_Handle.AAWW <- function(SUser, CmdString) {
|
||||
//获取金库
|
||||
local Cargo_C_Object = SUser.GetCharacCargo();
|
||||
//获取背包
|
||||
//在游戏中输入//一键入库即可调用
|
||||
Gm_InputFunc_Handle["一键入库"] <- function (SUser) {
|
||||
// 获取角色背包
|
||||
local InvenObj = SUser.GetInven();
|
||||
|
||||
// 物品槽范围: 57-152 (材料、消耗品栏)
|
||||
local INVENTORY_SLOT_START = 57;
|
||||
local INVENTORY_SLOT_END = 152;
|
||||
|
||||
local anyItemInserted = false; // 标志变量,用于跟踪是否有物品被成功插入
|
||||
|
||||
for (local slot = INVENTORY_SLOT_START; slot <= INVENTORY_SLOT_END; slot++) {
|
||||
local ItemObject = InvenObj.GetSlot(1, slot);
|
||||
local ItemId = ItemObject.GetIndex();
|
||||
local ItemName = PvfItem.GetNameById(ItemId);
|
||||
|
||||
// 如果物品ID无效,跳过当前循环
|
||||
if (ItemId <= 0) continue;
|
||||
local CheckFlag = CharacCargo_Check_Item_Exist(Cargo_C_Object, ItemId);
|
||||
// 如果仓库中没有该物品,跳过
|
||||
if (CheckFlag == -1) continue;
|
||||
|
||||
local Cargo_M_Object = NativePointer(Cargo_C_Object);
|
||||
// 获取仓库中对应物品的指针和数量
|
||||
local CargoItemPointer = NativePointer(Cargo_M_Object.add(4).readPointer()).add(61 * CheckFlag).readPointer();
|
||||
local CargoItem = Item(CargoItemPointer);
|
||||
local CargoItemId = NativePointer(Cargo_M_Object.add(4).readPointer()).add(61 * CheckFlag + 2).readU32();
|
||||
//仓库中的数量
|
||||
local CargoItemCount = CargoItem.GetAdd_Info() ? CargoItem.GetAdd_Info() : 1;
|
||||
//背包中的数量
|
||||
local InventoryItemCount = ItemObject.GetAdd_Info();
|
||||
|
||||
//检查物品堆叠是否超过上限
|
||||
local CanStack = Check_Item_Stack(ItemId, InventoryItemCount + CargoItemCount);
|
||||
if (CanStack == 0) {
|
||||
SUser.SendNotiPacketMessage("[ " + ItemName + " ]" + "超过堆叠上限,无法放入", 8);
|
||||
// 角色仓库
|
||||
local CargoObj = Sq_CallFunc(S_Ptr("0x08151a94"), "pointer", ["pointer"], SUser.C_Object);
|
||||
// 添加计数器
|
||||
local transferCount = 0;
|
||||
// 遍历背包消耗品栏及材料栏
|
||||
for (local i = 57; i <= 152; ++i) {
|
||||
// 获取背包物品
|
||||
local ItemObj = InvenObj.GetSlot(1, i);
|
||||
// 获取背包物品ID
|
||||
local Item_Id = ItemObj.GetIndex();
|
||||
local ItemName = PvfItem.GetNameById(Item_Id);
|
||||
// 如果物品ID为0或3037,跳过(在此可以添加其他需要跳过的物品ID)
|
||||
if (Item_Id == 0 || Item_Id == 3037) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// 将物品存入仓库
|
||||
local InsertResult = CharacCargo_Insert_Item(Cargo_C_Object, ItemObject.C_Object);
|
||||
if(InsertResult >= 0){
|
||||
SUser.SendNotiPacketMessage("[ " + ItemName + " ]" + "成功入库 x " + InventoryItemCount, 8);
|
||||
InvenObj.DeleteItemCount(ItemId,InventoryItemCount);
|
||||
SUser.SendUpdateItemList(1,0,slot);
|
||||
// 角色仓库是否存在背包物品
|
||||
local CargoSlot = Sq_CallFunc(S_Ptr("0x850bc14"), "int", ["pointer", "int"], CargoObj, Item_Id);
|
||||
// 如果角色仓库中没有该物品,跳过
|
||||
if(CargoSlot == -1) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// 获取仓库物品指针
|
||||
local cargoItemPointer = NativePointer(CargoObj).add(4).readPointer();
|
||||
// 获取角色仓库物品对象
|
||||
local cargoItemObj = NativePointer(cargoItemPointer).add(61 * CargoSlot);
|
||||
// 获取角色仓库物品ID
|
||||
local cargoItemId = NativePointer(cargoItemPointer).add(61 * CargoSlot + 2).readU32();
|
||||
// 获取角色仓库物品数量
|
||||
local cargoItemCount = Sq_CallFunc(S_Ptr("0x80F783A"), "int", ["pointer"], cargoItemObj.C_Object);
|
||||
|
||||
// 获取物品对象
|
||||
local PvfItem = PvfItem.GetPvfItemById(cargoItemId);
|
||||
|
||||
// 获取物品可堆叠数量
|
||||
local getStackableLimit = Sq_CallFunc(S_Ptr("0x0822C9FC"), "int", ["pointer"], PvfItem.C_Object);
|
||||
|
||||
// 如果仓库已达堆叠上限,跳过此物品
|
||||
if(cargoItemCount >= getStackableLimit) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// 获取背包物品数量
|
||||
local inventoryItemCount = Sq_CallFunc(S_Ptr("0x80F783A"), "int", ["pointer"], ItemObj.C_Object);
|
||||
// 获取物品是否可堆叠
|
||||
local checkStackableLimit = Sq_CallFunc(S_Ptr("0x08501A79"), "int", ["int", "int"], cargoItemId, cargoItemCount + inventoryItemCount);
|
||||
// 尝试将物品储存至角色仓库中
|
||||
local tryAddStackItem = Sq_CallFunc(S_Ptr("0x0850B4B0"), "int", ["pointer", "pointer", "int"], CargoObj, ItemObj.C_Object, CargoSlot);
|
||||
if (tryAddStackItem >= 0) {
|
||||
// 正式将物品插入角色仓库中
|
||||
Sq_CallFunc(S_Ptr("0x850b672"), "pointer", ["pointer", "pointer", "int"], CargoObj, ItemObj.C_Object, CargoSlot);
|
||||
// 删除背包中的物品
|
||||
ItemObj.Delete();
|
||||
transferCount++;
|
||||
SUser.SendNotiPacketMessage("[ " + ItemName + " ]" + "成功入库 x " + inventoryItemCount, 8);
|
||||
}
|
||||
|
||||
// 处理可堆叠物品
|
||||
if(checkStackableLimit == 0) {
|
||||
// 获取物品总数
|
||||
local totalCount = cargoItemCount + inventoryItemCount;
|
||||
|
||||
// 如果总数不超过上限,全部堆到仓库
|
||||
if(totalCount <= getStackableLimit) {
|
||||
// 将物品堆到仓库
|
||||
Sq_CallFunc(S_Ptr("0x80CB884"), "int", ["pointer", "int"], cargoItemObj.C_Object, totalCount);
|
||||
// 删除背包中的物品
|
||||
ItemObj.Delete();
|
||||
transferCount++;
|
||||
SUser.SendNotiPacketMessage("[ " + ItemName + " ]" + "成功入库 x " + inventoryItemCount, 8);
|
||||
} else {
|
||||
// 如果总数超过上限
|
||||
// 将仓库的物品数量设置为最大数量
|
||||
Sq_CallFunc(S_Ptr("0x80CB884"), "int", ["pointer", "int"], cargoItemObj.C_Object, getStackableLimit);
|
||||
// 将背包数量减去转移至仓库的数量
|
||||
local transferAmount = getStackableLimit - cargoItemCount;
|
||||
Sq_CallFunc(S_Ptr("0x80CB884"), "int", ["pointer", "int"], ItemObj.C_Object, totalCount - getStackableLimit);
|
||||
transferCount++;
|
||||
SUser.SendNotiPacketMessage("[ " + ItemName + " ]" + "成功入库 x " + transferAmount, 8);
|
||||
}
|
||||
}
|
||||
|
||||
// 通知客户端更新背包
|
||||
SUser.SendUpdateItemList(1, 0, i);
|
||||
}
|
||||
|
||||
//更新仓库
|
||||
SUser.SendItemSpace(2);
|
||||
};
|
||||
if (transferCount == 0) {
|
||||
SUser.SendNotiBox("没有可转移的物品!", 1);
|
||||
}
|
||||
// 通知客户端更新仓库
|
||||
SUser.SendItemSpace(2);
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
69
Start/Example/17.md
Normal file
69
Start/Example/17.md
Normal file
@@ -0,0 +1,69 @@
|
||||
## 史诗药剂 (贡献者: 倾泪寒 && 南瓜)
|
||||
|
||||
> 首先我们先在dp_s文件夹中建立一个项目文件夹 MyProject 方便管理
|
||||
|
||||

|
||||
|
||||
> 然后我们建立一个新文件 史诗药剂.nut 用于编写我们的代码
|
||||
|
||||
> 然后我们在史诗药剂.nut中写入以下代码
|
||||
|
||||
```
|
||||
/*
|
||||
文件名:史诗药剂.nut
|
||||
路径:MyProject/史诗药剂.nut
|
||||
创建日期:2025-03-28 10:21
|
||||
文件用途:史诗药剂
|
||||
*/
|
||||
|
||||
//➢SS药剂的ID
|
||||
EpicPotionID <- 2600006;
|
||||
//➢默认的药剂增加倍率
|
||||
EpicPotionOdds <- 0.1;
|
||||
//➢指定玩家增加深渊爆率
|
||||
EpicPotionlist <- {};
|
||||
//角色ID:增加个人深渊爆率
|
||||
EpicPotionlist[1] <- 1;
|
||||
|
||||
|
||||
Cb_GetItemRarity_Enter_Func["史诗药剂_逻辑"] <- function(args) {
|
||||
local Addr = NativePointer(args[0]);
|
||||
local VectorSize = (Addr.add(4).readU32() - Addr.readU32()) / 4;
|
||||
// 遍历队伍成员,找到使用了史诗药剂的玩家
|
||||
local userWithPotion = null;
|
||||
for (local i = 0; i< VectorSize; i++) {
|
||||
local elementAddr = NativePointer(Addr.readPointer()).add(i * 4);
|
||||
local user = elementAddr.readPointer();
|
||||
if (user && Sq_CallFunc(S_Ptr("0x865E994"), "int", ["pointer", "int", ], user, EpicPotionID) ) {
|
||||
userWithPotion = User(user);
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (userWithPotion && Haker.NextReturnAddress == "0x853583a") {
|
||||
local partyobj = userWithPotion.GetParty();
|
||||
// 检查是否单人
|
||||
if (Sq_CallFunc(S_Ptr("0x0859A16A"), "int", ["pointer", ], partyobj.C_Object) == 1) {
|
||||
local MaxRoll = NativePointer(args[1]).add(16).readU32();
|
||||
local odds = EpicPotionOdds; // 默认药剂的增加几率
|
||||
// 检查是否VIP玩家
|
||||
local charac_no = userWithPotion.GetCID();
|
||||
if (EpicPotionlist.rawin(charac_no)) {
|
||||
odds = EpicPotionlist[charac_no];
|
||||
}
|
||||
// 计算新的roll值
|
||||
args[2] = MathClass.getMin(args[2] + args[2] * odds, MaxRoll);
|
||||
}
|
||||
}
|
||||
return args;
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
> 最后我们回到dp_s文件夹中,打开Main.nut 加载我们刚才编写的逻辑 如果你已经开启过数据库连接池则不需要初始化数据库连接池的代码
|
||||
|
||||
```
|
||||
sq_RunScript("MyProject/史诗药剂.nut");
|
||||
```
|
||||
|
||||
> 至此一个简单的史诗药剂的逻辑就写完了
|
||||
Reference in New Issue
Block a user