|
|
@@ -82,7 +82,7 @@ class Item
|
|
|
|
|
|
// 获取来源信息
|
|
|
$sourceType = $options['source_type'] ?? null;
|
|
|
- $sourceId = $options['source_id'] ?? null;
|
|
|
+ $sourceId = $options['source_id'] ?? null;
|
|
|
// 检查用户是否已有该物品且过期时间相同,并且未满堆叠(排除冻结的物品)
|
|
|
$userItem = ItemUser::where('user_id', $userId)
|
|
|
->where('item_id', $itemId)
|
|
|
@@ -103,33 +103,33 @@ class Item
|
|
|
})
|
|
|
->first();
|
|
|
|
|
|
- $addedQuantity = $quantity;
|
|
|
+ $addedQuantity = $quantity;
|
|
|
$currentQuantity = 0;
|
|
|
|
|
|
if ($userItem) {
|
|
|
// 已有物品,增加数量
|
|
|
$currentQuantity = $userItem->quantity;
|
|
|
- $newQuantity = $currentQuantity + $quantity;
|
|
|
+ $newQuantity = $currentQuantity + $quantity;
|
|
|
|
|
|
// 检查最大堆叠限制
|
|
|
if ($item->max_stack > 0 && $newQuantity > $item->max_stack) {
|
|
|
// 超过最大堆叠,先填满当前堆叠
|
|
|
- $canAddToCurrent = $item->max_stack - $currentQuantity;
|
|
|
+ $canAddToCurrent = $item->max_stack - $currentQuantity;
|
|
|
$userItem->quantity = $item->max_stack;
|
|
|
$userItem->save();
|
|
|
|
|
|
// 触发物品数量变更事件(更新现有堆叠)
|
|
|
Event::dispatch(new ItemQuantityChanged(
|
|
|
- $userId,
|
|
|
- $itemId,
|
|
|
- null,
|
|
|
- $currentQuantity,
|
|
|
- $item->max_stack,
|
|
|
- $userItem->id,
|
|
|
- $userItem->is_frozen, // 旧冻结状态(数量变更时冻结状态不变)
|
|
|
- $userItem->is_frozen, // 新冻结状态(数量变更时冻结状态不变)
|
|
|
- $options
|
|
|
- ));
|
|
|
+ $userId,
|
|
|
+ $itemId,
|
|
|
+ null,
|
|
|
+ $currentQuantity,
|
|
|
+ $item->max_stack,
|
|
|
+ $userItem->id,
|
|
|
+ $userItem->is_frozen, // 旧冻结状态(数量变更时冻结状态不变)
|
|
|
+ $userItem->is_frozen, // 新冻结状态(数量变更时冻结状态不变)
|
|
|
+ $options
|
|
|
+ ));
|
|
|
|
|
|
// 剩余数量递归添加到新堆叠
|
|
|
$remainingQuantity = $quantity - $canAddToCurrent;
|
|
|
@@ -137,51 +137,51 @@ class Item
|
|
|
self::addNormalItem($userId, $itemId, $remainingQuantity, $options);
|
|
|
}
|
|
|
|
|
|
- $addedQuantity = $quantity;
|
|
|
+ $addedQuantity = $quantity;
|
|
|
$currentQuantity = $item->max_stack;
|
|
|
} else {
|
|
|
// 未超过最大堆叠,直接更新数量
|
|
|
- $oldQuantity = $userItem->quantity;
|
|
|
+ $oldQuantity = $userItem->quantity;
|
|
|
$userItem->quantity = $newQuantity;
|
|
|
$userItem->save();
|
|
|
$currentQuantity = $newQuantity;
|
|
|
|
|
|
// 触发物品数量变更事件
|
|
|
Event::dispatch(new ItemQuantityChanged(
|
|
|
- $userId,
|
|
|
- $itemId,
|
|
|
- null,
|
|
|
- $oldQuantity,
|
|
|
- $newQuantity,
|
|
|
- $userItem->id,
|
|
|
- $userItem->is_frozen, // 旧冻结状态(数量变更时冻结状态不变)
|
|
|
- $userItem->is_frozen, // 新冻结状态(数量变更时冻结状态不变)
|
|
|
- $options
|
|
|
- ));
|
|
|
+ $userId,
|
|
|
+ $itemId,
|
|
|
+ null,
|
|
|
+ $oldQuantity,
|
|
|
+ $newQuantity,
|
|
|
+ $userItem->id,
|
|
|
+ $userItem->is_frozen, // 旧冻结状态(数量变更时冻结状态不变)
|
|
|
+ $userItem->is_frozen, // 新冻结状态(数量变更时冻结状态不变)
|
|
|
+ $options
|
|
|
+ ));
|
|
|
}
|
|
|
} else {
|
|
|
// 没有该物品,创建新记录
|
|
|
$createQuantity = min($quantity, $item->max_stack > 0 ? $item->max_stack : $quantity);
|
|
|
- $userItem = new ItemUser([
|
|
|
- 'user_id' => $userId,
|
|
|
- 'item_id' => $itemId,
|
|
|
- 'quantity' => $createQuantity,
|
|
|
- 'expire_at' => $expireAt,
|
|
|
- ]);
|
|
|
+ $userItem = new ItemUser([
|
|
|
+ 'user_id' => $userId,
|
|
|
+ 'item_id' => $itemId,
|
|
|
+ 'quantity' => $createQuantity,
|
|
|
+ 'expire_at' => $expireAt,
|
|
|
+ ]);
|
|
|
$userItem->save();
|
|
|
|
|
|
// 触发物品数量变更事件(新增物品)
|
|
|
Event::dispatch(new ItemQuantityChanged(
|
|
|
- $userId,
|
|
|
- $itemId,
|
|
|
- null,
|
|
|
- 0, // 旧数量为0
|
|
|
- $createQuantity,
|
|
|
- $userItem->id,
|
|
|
- false, // 旧冻结状态(新增物品时为 false )
|
|
|
- false, // 新冻结状态(新增物品默认未冻结)
|
|
|
- $options
|
|
|
- ));
|
|
|
+ $userId,
|
|
|
+ $itemId,
|
|
|
+ null,
|
|
|
+ 0, // 旧数量为0
|
|
|
+ $createQuantity,
|
|
|
+ $userItem->id,
|
|
|
+ false, // 旧冻结状态(新增物品时为 false )
|
|
|
+ false, // 新冻结状态(新增物品默认未冻结)
|
|
|
+ $options
|
|
|
+ ));
|
|
|
|
|
|
// 如果数量超过最大堆叠,递归添加剩余数量
|
|
|
if ($item->max_stack > 0 && $quantity > $item->max_stack) {
|
|
|
@@ -214,11 +214,11 @@ class Item
|
|
|
Event::dispatch(new ItemAcquired($userId, $itemId, null, $addedQuantity, $options));
|
|
|
|
|
|
return [
|
|
|
- 'success' => true,
|
|
|
- 'item_id' => $itemId,
|
|
|
- 'quantity' => $addedQuantity,
|
|
|
+ 'success' => true,
|
|
|
+ 'item_id' => $itemId,
|
|
|
+ 'quantity' => $addedQuantity,
|
|
|
'current_quantity' => $currentQuantity,
|
|
|
- 'user_item_id' => $userItem->id,
|
|
|
+ 'user_item_id' => $userItem->id,
|
|
|
];
|
|
|
}
|
|
|
|
|
|
@@ -254,32 +254,32 @@ class Item
|
|
|
|
|
|
// 获取来源信息
|
|
|
$sourceType = $options['source_type'] ?? null;
|
|
|
- $sourceId = $options['source_id'] ?? null;
|
|
|
- if(!$sourceType || !$sourceId){
|
|
|
+ $sourceId = $options['source_id'] ?? null;
|
|
|
+ if (!$sourceType || !$sourceId) {
|
|
|
throw new Exception("物品 {$itemId} ,缺少来源类型.");
|
|
|
}
|
|
|
// 创建物品实例
|
|
|
$instance = new ItemInstance([
|
|
|
- 'item_id' => $itemId,
|
|
|
- 'name' => $options['name'] ?? $item->name,
|
|
|
- 'display_attributes' => $options['display_attributes'] ?? $item->display_attributes,
|
|
|
- 'numeric_attributes' => $options['numeric_attributes'] ?? $item->numeric_attributes,
|
|
|
- 'tradable' => $options['tradable'] ?? $item->tradable,
|
|
|
- 'is_bound' => $options['is_bound'] ?? false,
|
|
|
- 'bound_to' => $options['bound_to'] ?? null,
|
|
|
- 'bind_exp_time' => $options['bind_exp_time'] ?? null,
|
|
|
- 'expire_at' => $expireAt,
|
|
|
- ]);
|
|
|
+ 'item_id' => $itemId,
|
|
|
+ 'name' => $options['name'] ?? $item->name,
|
|
|
+ 'display_attributes' => $options['display_attributes'] ?? $item->display_attributes,
|
|
|
+ 'numeric_attributes' => $options['numeric_attributes'] ?? $item->numeric_attributes,
|
|
|
+ 'tradable' => $options['tradable'] ?? $item->tradable,
|
|
|
+ 'is_bound' => $options['is_bound'] ?? false,
|
|
|
+ 'bound_to' => $options['bound_to'] ?? null,
|
|
|
+ 'bind_exp_time' => $options['bind_exp_time'] ?? null,
|
|
|
+ 'expire_at' => $expireAt,
|
|
|
+ ]);
|
|
|
$instance->save();
|
|
|
|
|
|
// 关联到用户
|
|
|
$userItem = new ItemUser([
|
|
|
- 'user_id' => $userId,
|
|
|
- 'item_id' => $itemId,
|
|
|
- 'instance_id' => $instance->id,
|
|
|
- 'quantity' => 1, // 单独属性物品数量始终为1
|
|
|
- 'expire_at' => $expireAt,
|
|
|
- ]);
|
|
|
+ 'user_id' => $userId,
|
|
|
+ 'item_id' => $itemId,
|
|
|
+ 'instance_id' => $instance->id,
|
|
|
+ 'quantity' => 1, // 单独属性物品数量始终为1
|
|
|
+ 'expire_at' => $expireAt,
|
|
|
+ ]);
|
|
|
$userItem->save();
|
|
|
|
|
|
// 记录交易日志
|
|
|
@@ -302,21 +302,21 @@ class Item
|
|
|
|
|
|
// 触发物品数量变更事件(新增物品)
|
|
|
Event::dispatch(new ItemQuantityChanged(
|
|
|
- $userId,
|
|
|
- $itemId,
|
|
|
- $instance->id,
|
|
|
- 0, // 旧数量为0
|
|
|
- 1, // 新数量为1
|
|
|
- $userItem->id,
|
|
|
- false, // 旧冻结状态(新增物品时为false)
|
|
|
- false, // 新冻结状态(新增物品默认未冻结)
|
|
|
- $options
|
|
|
- ));
|
|
|
+ $userId,
|
|
|
+ $itemId,
|
|
|
+ $instance->id,
|
|
|
+ 0, // 旧数量为0
|
|
|
+ 1, // 新数量为1
|
|
|
+ $userItem->id,
|
|
|
+ false, // 旧冻结状态(新增物品时为false)
|
|
|
+ false, // 新冻结状态(新增物品默认未冻结)
|
|
|
+ $options
|
|
|
+ ));
|
|
|
|
|
|
return [
|
|
|
- 'success' => true,
|
|
|
- 'item_id' => $itemId,
|
|
|
- 'instance_id' => $instance->id,
|
|
|
+ 'success' => true,
|
|
|
+ 'item_id' => $itemId,
|
|
|
+ 'instance_id' => $instance->id,
|
|
|
'user_item_id' => $userItem->id,
|
|
|
];
|
|
|
}
|
|
|
@@ -353,8 +353,9 @@ class Item
|
|
|
if ($includeFrozen) {
|
|
|
// 当包含冻结物品时,优先消耗冻结物品,再消耗未冻结物品
|
|
|
$userItems = $query->orderBy('is_frozen', 'desc') // 冻结物品优先(true > false)
|
|
|
- ->orderBy('expire_at') // 然后按过期时间排序
|
|
|
- ->get();
|
|
|
+ ->orderBy('quantity', 'desc')// 数量倒序
|
|
|
+ ->orderBy('expire_at') // 然后按过期时间排序
|
|
|
+ ->get();
|
|
|
} else {
|
|
|
// 只消耗未冻结物品时,按过期时间排序
|
|
|
$userItems = $query->orderBy('expire_at')->get();
|
|
|
@@ -368,7 +369,7 @@ class Item
|
|
|
|
|
|
// 获取来源信息
|
|
|
$sourceType = $options['source_type'] ?? null;
|
|
|
- $sourceId = $options['source_id'] ?? null;
|
|
|
+ $sourceId = $options['source_id'] ?? null;
|
|
|
|
|
|
// 开始消耗物品
|
|
|
$remainingQuantity = $quantity;
|
|
|
@@ -379,9 +380,9 @@ class Item
|
|
|
|
|
|
if ($userItem->quantity <= $remainingQuantity) {
|
|
|
// 当前堆叠数量不足,全部消耗
|
|
|
- $consumedQuantity = $userItem->quantity;
|
|
|
+ $consumedQuantity = $userItem->quantity;
|
|
|
$remainingQuantity -= $consumedQuantity;
|
|
|
- $oldQuantity = $userItem->quantity;
|
|
|
+ $oldQuantity = $userItem->quantity;
|
|
|
|
|
|
// 记录交易日志
|
|
|
self::logTransaction(
|
|
|
@@ -404,21 +405,21 @@ class Item
|
|
|
|
|
|
// 触发物品数量变更事件
|
|
|
Event::dispatch(new ItemQuantityChanged(
|
|
|
- $userId,
|
|
|
- $itemId,
|
|
|
- null,
|
|
|
- $oldQuantity,
|
|
|
- 0,
|
|
|
- $userItem->id,
|
|
|
- $userItem->is_frozen, // 旧冻结状态(消耗时冻结状态不变)
|
|
|
- $userItem->is_frozen, // 新冻结状态(消耗时冻结状态不变)
|
|
|
- $options
|
|
|
- ));
|
|
|
+ $userId,
|
|
|
+ $itemId,
|
|
|
+ null,
|
|
|
+ $oldQuantity,
|
|
|
+ 0,
|
|
|
+ $userItem->id,
|
|
|
+ $userItem->is_frozen, // 旧冻结状态(消耗时冻结状态不变)
|
|
|
+ $userItem->is_frozen, // 新冻结状态(消耗时冻结状态不变)
|
|
|
+ $options
|
|
|
+ ));
|
|
|
} else {
|
|
|
// 当前堆叠数量足够,部分消耗
|
|
|
- $consumedQuantity = $remainingQuantity;
|
|
|
- $oldQuantity = $userItem->quantity;
|
|
|
- $newQuantity = $oldQuantity - $consumedQuantity;
|
|
|
+ $consumedQuantity = $remainingQuantity;
|
|
|
+ $oldQuantity = $userItem->quantity;
|
|
|
+ $newQuantity = $oldQuantity - $consumedQuantity;
|
|
|
$userItem->quantity = $newQuantity;
|
|
|
$userItem->save();
|
|
|
$remainingQuantity = 0;
|
|
|
@@ -440,16 +441,16 @@ class Item
|
|
|
|
|
|
// 触发物品数量变更事件
|
|
|
Event::dispatch(new ItemQuantityChanged(
|
|
|
- $userId,
|
|
|
- $itemId,
|
|
|
- null,
|
|
|
- $oldQuantity,
|
|
|
- $newQuantity,
|
|
|
- $userItem->id,
|
|
|
- $userItem->is_frozen, // 旧冻结状态(消耗时冻结状态不变)
|
|
|
- $userItem->is_frozen, // 新冻结状态(消耗时冻结状态不变)
|
|
|
- $options
|
|
|
- ));
|
|
|
+ $userId,
|
|
|
+ $itemId,
|
|
|
+ null,
|
|
|
+ $oldQuantity,
|
|
|
+ $newQuantity,
|
|
|
+ $userItem->id,
|
|
|
+ $userItem->is_frozen, // 旧冻结状态(消耗时冻结状态不变)
|
|
|
+ $userItem->is_frozen, // 新冻结状态(消耗时冻结状态不变)
|
|
|
+ $options
|
|
|
+ ));
|
|
|
}
|
|
|
|
|
|
// 触发物品消耗事件
|
|
|
@@ -457,9 +458,9 @@ class Item
|
|
|
}
|
|
|
|
|
|
return [
|
|
|
- 'success' => true,
|
|
|
- 'item_id' => $itemId,
|
|
|
- 'quantity' => $quantity,
|
|
|
+ 'success' => true,
|
|
|
+ 'item_id' => $itemId,
|
|
|
+ 'quantity' => $quantity,
|
|
|
'remaining_quantity' => $totalQuantity - $quantity,
|
|
|
];
|
|
|
}
|
|
|
@@ -500,7 +501,7 @@ class Item
|
|
|
|
|
|
// 获取来源信息
|
|
|
$sourceType = $options['source_type'] ?? null;
|
|
|
- $sourceId = $options['source_id'] ?? null;
|
|
|
+ $sourceId = $options['source_id'] ?? null;
|
|
|
|
|
|
// 记录交易日志
|
|
|
self::logTransaction(
|
|
|
@@ -529,7 +530,7 @@ class Item
|
|
|
Event::dispatch(new ItemConsumed($userId, $itemId, $instanceId, 1, $options));
|
|
|
|
|
|
return Res::success('', [
|
|
|
- 'item_id' => $itemId,
|
|
|
+ 'item_id' => $itemId,
|
|
|
'instance_id' => $instanceId,
|
|
|
]);
|
|
|
}
|
|
|
@@ -556,7 +557,7 @@ class Item
|
|
|
?int $instanceId,
|
|
|
int $quantity,
|
|
|
int $transactionType,
|
|
|
- $sourceType = null,
|
|
|
+ $sourceType = null,
|
|
|
?int $sourceId = null,
|
|
|
?array $details = null,
|
|
|
?string $expireAt = null,
|
|
|
@@ -580,18 +581,18 @@ class Item
|
|
|
}
|
|
|
|
|
|
return ItemTransactionLog::create([
|
|
|
- 'user_id' => $userId,
|
|
|
- 'item_id' => $itemId,
|
|
|
- 'instance_id' => $instanceId,
|
|
|
- 'quantity' => $quantity,
|
|
|
- 'transaction_type' => $transactionType,
|
|
|
- 'source_type' => $sourceTypeValue,
|
|
|
- 'source_id' => $sourceId,
|
|
|
- 'details' => $details,
|
|
|
- 'expire_at' => $expireAt,
|
|
|
- 'ip_address' => $ipAddress,
|
|
|
- 'device_info' => $deviceInfo,
|
|
|
- ]);
|
|
|
+ 'user_id' => $userId,
|
|
|
+ 'item_id' => $itemId,
|
|
|
+ 'instance_id' => $instanceId,
|
|
|
+ 'quantity' => $quantity,
|
|
|
+ 'transaction_type' => $transactionType,
|
|
|
+ 'source_type' => $sourceTypeValue,
|
|
|
+ 'source_id' => $sourceId,
|
|
|
+ 'details' => $details,
|
|
|
+ 'expire_at' => $expireAt,
|
|
|
+ 'ip_address' => $ipAddress,
|
|
|
+ 'device_info' => $deviceInfo,
|
|
|
+ ]);
|
|
|
}
|
|
|
|
|
|
}
|