死亡 生成 黄豆获取1
This commit is contained in:
1 parent
faa3a22631
commit
104603fd64
6 files changed
+654
-2
No files matched your search
+45
-2
@@ -44,6 +44,10 @@ from ...BlueFoxTools.SpecialFunciton.BlueFoxSystem import BlueFoxServerSystem
|
||||
from ...BlueFoxTools.ToolsConfig import LevelId
|
||||
from ...BlueFoxTools.ModConfig import MOD_NAME
|
||||
|
||||
# ---- 死亡生物·生成引擎: 玩家杀猪/牛/羊/鱿鱼/村民 -> 尸体方块 ----
|
||||
# 它是"普通逻辑类"(自己不监听), 由本分发器实例化并把 ServerEntityDieEvent 转给它。
|
||||
from ..siwangshengwu.service.DeadmobGeneratorService import DeadmobGeneratorService
|
||||
|
||||
# ---- 汤锅盛出自定义事件名(与客户端 ClientFeatureDispatcher TAKEOUT_EVENT 一致) ----
|
||||
TAKEOUT_EVENT = "TakeoutRequest"
|
||||
|
||||
@@ -112,6 +116,7 @@ class FeatureDispatcher(BlueFoxServerSystem):
|
||||
timerSet = set()
|
||||
tryUseOwner = {} # 物品名 -> 服务: 手持"直接吃"物品(长按使用)路由
|
||||
tryUseSet = set()
|
||||
grassDropOwners = [] # 破坏"草/杂草"时概率掉食材(如黄豆)的服务列表; OnDestroy 逐个尝试
|
||||
|
||||
# ---- 拆方块掉落映射: 方块名 → 掉落对应的原版生食材 ----
|
||||
# 玩家左键破坏这些"放置的半成品/死鱼"方块时, 取消默认掉落, 改为掉对应的原版生食材
|
||||
@@ -166,6 +171,15 @@ class FeatureDispatcher(BlueFoxServerSystem):
|
||||
cls.tryUseOwner[item] = service
|
||||
cls.tryUseSet.add(item)
|
||||
|
||||
@classmethod
|
||||
def registerGrassDrop(cls, service):
|
||||
"""
|
||||
破坏草/杂草掉食材(如黄豆)的服务初始化时调用:把自己挂进 grassDropOwners。
|
||||
OnDestroy 遇到草/杂草方块会逐个调用这些服务的 handleGrassDrop(args)。
|
||||
"""
|
||||
if service not in cls.grassDropOwners:
|
||||
cls.grassDropOwners.append(service)
|
||||
|
||||
@classmethod
|
||||
def startTimerFor(cls, blockName, dim, pos, playerId=None):
|
||||
"""
|
||||
@@ -190,6 +204,7 @@ class FeatureDispatcher(BlueFoxServerSystem):
|
||||
super(FeatureDispatcher, self).__init__(namespace, systemName)
|
||||
print "===== FeatureDispatcher init ====="
|
||||
self._cancelItemUse = {} # 将要取消下一次物品使用的玩家ID集合(防止喝药水等)
|
||||
self._deadmobGen = DeadmobGeneratorService() # 死亡生物·生成引擎(杀猪牛羊等->尸体方块)
|
||||
self.ListenEvent()
|
||||
|
||||
def Destroy(self):
|
||||
@@ -202,15 +217,19 @@ class FeatureDispatcher(BlueFoxServerSystem):
|
||||
|
||||
def ListenEvent(self):
|
||||
"""
|
||||
注册六个事件:
|
||||
注册七个事件:
|
||||
1. ServerBlockUseEvent —— 玩家右键方块(所有功能的右键转换入口)
|
||||
2. ServerItemUseOnEvent —— 手持物品右键方块表面(如放置生鸡肉)
|
||||
3. ServerItemTryUseEvent —— 玩家尝试使用物品(拦截喝药水/吃食物等默认行为)
|
||||
4. ServerBlockEntityTickEvent —— 计时方块每tick触发(烤制/饲料变空等,持久化计时)
|
||||
5. ServerPlayerTryDestroyBlockEvent —— 玩家拆方块(放置的死鱼/生鸡肉掉回原版生食材)
|
||||
5. ServerPlayerTryDestroyBlockEvent —— 玩家拆方块(放置的死鱼/生鸡肉掉回原版生食材;
|
||||
以及草/杂草 概率掉黄豆→ 转给 shicai 的 handleGrassDrop)
|
||||
6. ItemUseOnAfterServerEvent —— 放置方块/生态后触发(携带放置者 entityId)。
|
||||
用于"创造模式直接放生态"也能拿到是谁放的 → 记录到计时源方块 rtdd_tp,
|
||||
让计时源服务能"谁放提示发给谁"(如烧烤直接放烤乳猪也提示营火)。
|
||||
7. MobDieEvent —— 生物死亡(玩家杀死猪/牛/羊/鱿鱼/村民 →
|
||||
转给 _deadmobGen 生成尸体方块)。注意: 网易该 SDK 里死亡事件叫 MobDieEvent
|
||||
(参数 id=死亡实体, attacker=击杀者), 不是 ServerEntityDieEvent。
|
||||
"""
|
||||
self.ListenForEvent(serverApi.GetEngineNamespace(),
|
||||
serverApi.GetEngineSystemName(),
|
||||
@@ -230,6 +249,9 @@ class FeatureDispatcher(BlueFoxServerSystem):
|
||||
self.ListenForEvent(serverApi.GetEngineNamespace(),
|
||||
serverApi.GetEngineSystemName(),
|
||||
"ItemUseOnAfterServerEvent", self, self.OnItemPlaceAfter)
|
||||
self.ListenForEvent(serverApi.GetEngineNamespace(),
|
||||
serverApi.GetEngineSystemName(),
|
||||
"MobDieEvent", self, self.OnEntityDie)
|
||||
# 7. TakeoutRequest —— 客户端拦截(碗/盘,汤锅/炒锅/油锅成品)放置预览后, 显式请求服务端盛出。
|
||||
# 客户端系统 ClientFeatureDispatcher 用 NotifyToServer(TAKEOUT_EVENT) 发送,
|
||||
# 服务端以 MOD_NAME + 客户端系统名 监听该自定义事件。
|
||||
@@ -268,6 +290,9 @@ class FeatureDispatcher(BlueFoxServerSystem):
|
||||
self.UnListenForEvent(serverApi.GetEngineNamespace(),
|
||||
serverApi.GetEngineSystemName(),
|
||||
"ItemUseOnAfterServerEvent", self, self.OnItemPlaceAfter)
|
||||
self.UnListenForEvent(serverApi.GetEngineNamespace(),
|
||||
serverApi.GetEngineSystemName(),
|
||||
"MobDieEvent", self, self.OnEntityDie)
|
||||
self.UnListenForEvent(MOD_NAME, "ClientFeatureDispatcher",
|
||||
TAKEOUT_EVENT, self, self.OnTakeoutRequest)
|
||||
self.UnListenForEvent(MOD_NAME, "ClientFeatureDispatcher",
|
||||
@@ -630,6 +655,17 @@ class FeatureDispatcher(BlueFoxServerSystem):
|
||||
# 主入口5:玩家拆方块 → 放置的死鱼/生鸡肉掉回原版生食材
|
||||
# ============================================================================
|
||||
|
||||
def OnEntityDie(self, args):
|
||||
"""
|
||||
玩家杀死生物时触发(ServerEntityDieEvent)。
|
||||
转给死亡生物·生成引擎: 若击杀者是玩家且被杀是 猪/牛/羊/鱿鱼/村民,
|
||||
在死亡位置生成对应尸体方块。
|
||||
"""
|
||||
try:
|
||||
self._deadmobGen.OnEntityDie(args)
|
||||
except Exception as e:
|
||||
print "[FD-OnEntityDie-ERR]", e
|
||||
|
||||
def OnDestroy(self, args):
|
||||
"""
|
||||
玩家拆方块时触发。
|
||||
@@ -642,6 +678,13 @@ class FeatureDispatcher(BlueFoxServerSystem):
|
||||
blockName = args.get("fullName") or args.get("blockName")
|
||||
args["blockName"] = blockName # 统一成 blockName 字段, 服务内部直接用
|
||||
|
||||
# 0. 草/杂草 概率掉食材(黄豆): 逐个尝试挂了 handleGrassDrop 的服务。
|
||||
# 如 shicai: 打草概率掉黄豆, 不取消破坏本身。
|
||||
if self.grassDropOwners:
|
||||
for _s in self.grassDropOwners:
|
||||
if hasattr(_s, "handleGrassDrop") and _s.handleGrassDrop(args):
|
||||
return
|
||||
|
||||
# 1. 优先: 归属的右键服务实现了 handleDestroy → 交给服务处理(逐个 fallback)
|
||||
services = self.blockOwnerAll.get(blockName)
|
||||
if services:
|
||||
|
||||
Reference in new issue
Block a user