GameItems模块负责游戏内物品系统的管理,包括基础物品属性和特殊物品(如宝箱)的管理。
物品基础管理
宝箱类物品
过期机制
属性系统
GameItems/
├── Actions/ # 物品操作类
├── Enums/ # 枚举类
├── Events/ # 事件类
├── Handlers/ # 处理器
├── Models/ # 模型
├── Repositories/ # 数据仓库
├── Services/ # 服务类
├── Validations/ # 验证类
├── README.md # 模块说明
└── README.roo.md # 设计文档
属性:
方法:
属性:
方法:
继承自Item,增加宝箱特有功能:
属性:
方法:
$item = ItemService::getItem('item_tid');
$item->acquire($user, $amount);
$chest = ItemService::getItem('chest_tid');
$rewards = $chest->open($user);
CREATE TABLE `game_items` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`tid` varchar(64) NOT NULL COMMENT '物品唯一标识',
`name` varchar(128) NOT NULL COMMENT '物品名称',
`type` varchar(32) NOT NULL COMMENT '物品类型',
`display_attrs` json DEFAULT NULL COMMENT '展示属性(名称、描述、图标等)',
`numeric_attrs` json DEFAULT NULL COMMENT '数值属性(攻击力、耐久度等)',
`expire_at` timestamp NULL DEFAULT NULL COMMENT '全局过期时间',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `game_items_tid_unique` (`tid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `item_groups` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`group_id` varchar(64) NOT NULL COMMENT '组ID',
`name` varchar(128) NOT NULL COMMENT '组名称',
`items` json NOT NULL COMMENT '组内物品配置',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `item_groups_group_id_unique` (`group_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `game_chests` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`item_tid` varchar(64) NOT NULL COMMENT '关联物品TID',
`rewards` json NOT NULL COMMENT '奖励配置(可配置物品或物品组)',
`open_limit` int DEFAULT NULL COMMENT '开启限制',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `game_chests_item_tid_unique` (`item_tid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
{
"group_id": "weapon_group_1",
"name": "初级武器组",
"items": [
{
"item_tid": "sword_1",
"weight": 30
},
{
"item_tid": "axe_1",
"weight": 20
}
]
}
{
"rewards": [
{
"type": "group",
"group_id": "weapon_group_1",
"count": 1
}
]
}
{
"rewards": [
{
"item_tid": "物品TID",
"min": 1,
"max": 3,
"probability": 0.5,
"conditions": {
"level": 10,
"vip_level": 3
}
}
],
"guarantees": [
{
"item_tid": "保底物品TID",
"count": 10,
"amount": 1
}
]
}
字段说明:
rewards: 常规奖励列表
item_tid: 奖励物品TIDmin: 最小数量max: 最大数量probability: 掉落概率(0-1)conditions: 获取条件(可选)guarantees: 保底奖励列表(可选)
item_tid: 保底物品TIDcount: 开启次数达到后触发amount: 奖励数量CREATE TABLE `item_users` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`user_id` bigint unsigned NOT NULL COMMENT '用户ID',
`item_tid` varchar(64) NOT NULL COMMENT '物品TID',
`quantity` int NOT NULL DEFAULT '0' COMMENT '数量(仅用于可堆叠物品)',
`expire_at` timestamp NULL DEFAULT NULL COMMENT '用户特定过期时间',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `user_items_user_id_item_tid_unique` (`user_id`,`item_tid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `item_instances` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`user_id` bigint unsigned NOT NULL COMMENT '用户ID',
`item_tid` varchar(64) NOT NULL COMMENT '物品TID',
`instance_id` varchar(64) NOT NULL COMMENT '实例唯一ID',
`display_attrs` json NOT NULL COMMENT '展示属性(名称、图标、皮肤等)',
`numeric_attrs` json NOT NULL COMMENT '数值属性(攻击力、耐久度等)',
`expire_at` timestamp NULL DEFAULT NULL COMMENT '过期时间',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `item_instances_instance_id_unique` (`instance_id`),
KEY `item_instances_user_id_index` (`user_id`),
KEY `item_instances_item_tid_index` (`item_tid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `chest_open_logs` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`user_id` bigint unsigned NOT NULL COMMENT '用户ID',
`chest_tid` varchar(64) NOT NULL COMMENT '宝箱TID',
`rewards` json NOT NULL COMMENT '获得的奖励',
`opened_at` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '开启时间',
PRIMARY KEY (`id`),
KEY `chest_open_logs_user_id_index` (`user_id`),
KEY `chest_open_logs_chest_tid_index` (`chest_tid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
CREATE TABLE `user_chest_counts` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`user_id` bigint unsigned NOT NULL COMMENT '用户ID',
`chest_tid` varchar(64) NOT NULL COMMENT '宝箱TID',
`open_count` int NOT NULL DEFAULT 0 COMMENT '开启次数',
`last_opened_at` timestamp NULL DEFAULT NULL COMMENT '最后开启时间',
`created_at` timestamp NULL DEFAULT NULL,
`updated_at` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `user_chest_counts_user_chest_unique` (`user_id`, `chest_tid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
user_chest_counts表中的open_countopen_count达到保底配置中的count值时:
open_count为0