kill杀死不生成尸体(可用版本)
This commit is contained in:
1 parent
11ed9214ce
commit
23598ed3dd
5 files changed
+125
-8
No files matched your search
@@ -108,9 +108,14 @@ BEATER_BLOCKS = [
|
||||
# ============================================================================
|
||||
SOYBEAN_ITEM = "rtdd:soybean" # 黄豆
|
||||
SOYBEAN_COUNT = 16 # 磨一次要16个黄豆
|
||||
WHEAT_ITEM = "minecraft:wheat" # 小麦(磨面原料)
|
||||
WHEAT_COUNT = 6 # 磨一次要6个小麦
|
||||
FLOUR_ITEM = "rtdd:farineblcok" # 面粉(石磨产物, 方块物品)
|
||||
STONEMILL_GRIND_COUNT = 4 # 右键4次完成研磨
|
||||
GLASS_TANK_ITEM = "rtdd:medicinetank" # 玻璃罐(取出油罐)
|
||||
OIL_CAN_ITEM = "rtdd:oilcan" # 油罐(石磨产物)
|
||||
# 石磨材料标识(存方块实体 rtdd_stm): 'soybean'=黄豆, 'wheat'=小麦
|
||||
STONEMILL_MATERIAL_KEY = "rtdd_stm"
|
||||
|
||||
# ============================================================================
|
||||
# 四B、手持厨具物品(七、手持厨具物品): 锅铲 <-> 带油锅铲, 油罐蘸油/上油炒锅
|
||||
|
||||
+69
-8
@@ -46,7 +46,8 @@ from ..ChujuData import (
|
||||
STOVE_RULES, MEATBALLMAKER_RULES, MEATBALL_TIMERS,
|
||||
MEAT_ITEMS, MILK_ITEM, BUCKET_ITEM, EGG_ITEM,
|
||||
BOWL_ITEM, PLATE_ITEM, CREAM_ITEM, EGG_CUSTARD_ITEM, BEATER_BLOCKS,
|
||||
SOYBEAN_ITEM, SOYBEAN_COUNT, STONEMILL_GRIND_COUNT,
|
||||
SOYBEAN_ITEM, SOYBEAN_COUNT, WHEAT_ITEM, WHEAT_COUNT,
|
||||
FLOUR_ITEM, STONEMILL_GRIND_COUNT, STONEMILL_MATERIAL_KEY,
|
||||
GLASS_TANK_ITEM, OIL_CAN_ITEM, STEAMER_RULES,
|
||||
SPATULA, SPATULA_OIL, WOK, OIL_PAN, OIL_CAN_USES,
|
||||
)
|
||||
@@ -541,14 +542,17 @@ class ChujuService(BlueFoxServerSystem):
|
||||
playerId = args.get("playerId")
|
||||
x, y, z = args.get("x"), args.get("y"), args.get("z")
|
||||
dim = comp.CreateDimension(playerId).GetEntityDimensionId()
|
||||
# 读取研磨进度;None 或 <0(已清豆/-1) = 空石磨
|
||||
# 读取研磨进度与材料;None 或 <0(已清豆/-1) = 空石磨
|
||||
prog = self._readMill((x, y, z), dim)
|
||||
if prog is None or prog < 0:
|
||||
return False
|
||||
# 有黄豆:额外掉落16个(石磨本体由默认破坏掉落)
|
||||
mat = self._readMillMat((x, y, z), dim) or "soybean"
|
||||
ret = FLOUR_ITEM if mat == "wheat" else SOYBEAN_ITEM
|
||||
count = WHEAT_COUNT if mat == "wheat" else SOYBEAN_COUNT
|
||||
# 有材料:额外掉落对应原料(石磨本体由默认破坏掉落)
|
||||
try:
|
||||
self.CreateEngineItemEntity(
|
||||
{"itemName": SOYBEAN_ITEM, "count": SOYBEAN_COUNT, "auxValue": 0},
|
||||
{"itemName": ret, "count": count, "auxValue": 0},
|
||||
dim, (x, y + 0.5, z))
|
||||
except Exception:
|
||||
pass
|
||||
@@ -556,9 +560,23 @@ class ChujuService(BlueFoxServerSystem):
|
||||
|
||||
def _handleStonemill(self, playerId, pos, dim, itemDict, itemName, key):
|
||||
prog = self._readMill(pos, dim) # None=空, 0~3=研磨中, 4=完成
|
||||
mat = self._readMillMat(pos, dim) or "soybean" # 默认黄豆; 'wheat'=小麦
|
||||
|
||||
# ---- 空石磨 + 黄豆(16) -> 加入黄豆 ----
|
||||
# ---- 空石磨 + 黄豆(16) 或 小麦(6) -> 加入 ----
|
||||
if prog is None:
|
||||
if itemName == WHEAT_ITEM:
|
||||
if (itemDict.get("count") or 0) < WHEAT_COUNT:
|
||||
comp.CreateMsg(playerId).NotifyOneMessage(
|
||||
playerId, "§c需要 %d 个小麦" % WHEAT_COUNT)
|
||||
return True
|
||||
if not self.checkCooldown(key, 0.5):
|
||||
return True
|
||||
self.consumeItem(playerId, itemDict, WHEAT_COUNT)
|
||||
self._writeMillMat(dim, pos, "wheat")
|
||||
self._writeMill(dim, pos, 0)
|
||||
comp.CreateMsg(playerId).NotifyOneMessage(
|
||||
playerId, "§a加入小麦,空手右键研磨")
|
||||
return True
|
||||
if itemName == SOYBEAN_ITEM:
|
||||
if (itemDict.get("count") or 0) < SOYBEAN_COUNT:
|
||||
comp.CreateMsg(playerId).NotifyOneMessage(
|
||||
@@ -567,6 +585,7 @@ class ChujuService(BlueFoxServerSystem):
|
||||
if not self.checkCooldown(key, 0.5):
|
||||
return True
|
||||
self.consumeItem(playerId, itemDict, SOYBEAN_COUNT)
|
||||
self._writeMillMat(dim, pos, "soybean")
|
||||
self._writeMill(dim, pos, 0)
|
||||
comp.CreateMsg(playerId).NotifyOneMessage(
|
||||
playerId, "§a加入黄豆,空手右键研磨")
|
||||
@@ -583,15 +602,28 @@ class ChujuService(BlueFoxServerSystem):
|
||||
self._rotateMill(pos, dim)
|
||||
self._writeMill(dim, pos, newProg)
|
||||
if newProg >= STONEMILL_GRIND_COUNT:
|
||||
comp.CreateMsg(playerId).NotifyOneMessage(
|
||||
playerId, "§a研磨完成,可加玻璃罐取油")
|
||||
tip = "§a研磨完成,可空手取出 面粉" if mat == "wheat" \
|
||||
else "§a研磨完成,可加玻璃罐取油"
|
||||
comp.CreateMsg(playerId).NotifyOneMessage(playerId, tip)
|
||||
else:
|
||||
comp.CreateMsg(playerId).NotifyOneMessage(
|
||||
playerId, "§a研磨中,(%d/%d)" % (newProg, STONEMILL_GRIND_COUNT))
|
||||
return True
|
||||
|
||||
# ---- 完成: + 玻璃罐 -> 油罐 ----
|
||||
# ---- 完成 ----
|
||||
if prog >= STONEMILL_GRIND_COUNT:
|
||||
if mat == "wheat":
|
||||
# 小麦已磨成面粉: 空手右键 -> 掉落 1 面粉 + 还原空
|
||||
if itemName and itemName != "minecraft:air":
|
||||
return False
|
||||
if not self.checkCooldown(key, 0.5):
|
||||
return True
|
||||
self.dropItems(dim, pos, [{"name": FLOUR_ITEM, "count": 1}])
|
||||
self._clearMill(dim, pos)
|
||||
comp.CreateMsg(playerId).NotifyOneMessage(
|
||||
playerId, "§a取出了面粉")
|
||||
return True
|
||||
# 黄豆: + 玻璃罐 -> 油罐
|
||||
if itemName == GLASS_TANK_ITEM:
|
||||
if not self.checkCooldown(key, 0.5):
|
||||
return True
|
||||
@@ -666,11 +698,40 @@ class ChujuService(BlueFoxServerSystem):
|
||||
except Exception:
|
||||
return None
|
||||
|
||||
def _writeMillMat(self, dim, pos, mat):
|
||||
"""写入石磨材料标识('soybean'/'wheat')"""
|
||||
try:
|
||||
data = blockEntityDataComp.GetBlockEntityData(dim, pos)
|
||||
if data is None:
|
||||
gameComp.AddTimer(0.1, self._writeMillMatDelayed, dim, pos, mat)
|
||||
return
|
||||
data[STONEMILL_MATERIAL_KEY] = str(mat)
|
||||
except Exception:
|
||||
gameComp.AddTimer(0.1, self._writeMillMatDelayed, dim, pos, mat)
|
||||
|
||||
def _writeMillMatDelayed(self, dim, pos, mat):
|
||||
try:
|
||||
data = blockEntityDataComp.GetBlockEntityData(dim, pos)
|
||||
if data is not None:
|
||||
data[STONEMILL_MATERIAL_KEY] = str(mat)
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
def _readMillMat(self, pos, dim):
|
||||
try:
|
||||
data = blockEntityDataComp.GetBlockEntityData(dim, pos)
|
||||
if data is None:
|
||||
return None
|
||||
return data[STONEMILL_MATERIAL_KEY]
|
||||
except Exception:
|
||||
return None
|
||||
|
||||
def _clearMill(self, dim, pos):
|
||||
try:
|
||||
data = blockEntityDataComp.GetBlockEntityData(dim, pos)
|
||||
if data is not None:
|
||||
data["rtdd_mill"] = -1
|
||||
data[STONEMILL_MATERIAL_KEY] = None
|
||||
except Exception:
|
||||
pass
|
||||
|
||||
|
||||
+31
@@ -33,6 +33,7 @@
|
||||
================================================================================
|
||||
"""
|
||||
import time
|
||||
import random
|
||||
import mod.server.extraServerApi as serverApi
|
||||
|
||||
# ---- 网易API基础对象 ----
|
||||
@@ -252,6 +253,9 @@ class FeatureDispatcher(BlueFoxServerSystem):
|
||||
self.ListenForEvent(serverApi.GetEngineNamespace(),
|
||||
serverApi.GetEngineSystemName(),
|
||||
"MobDieEvent", self, self.OnEntityDie)
|
||||
self.ListenForEvent(serverApi.GetEngineNamespace(),
|
||||
serverApi.GetEngineSystemName(),
|
||||
"PlayerFishingServerEvent", self, self.OnFishing)
|
||||
# 7. TakeoutRequest —— 客户端拦截(碗/盘,汤锅/炒锅/油锅成品)放置预览后, 显式请求服务端盛出。
|
||||
# 客户端系统 ClientFeatureDispatcher 用 NotifyToServer(TAKEOUT_EVENT) 发送,
|
||||
# 服务端以 MOD_NAME + 客户端系统名 监听该自定义事件。
|
||||
@@ -293,6 +297,9 @@ class FeatureDispatcher(BlueFoxServerSystem):
|
||||
self.UnListenForEvent(serverApi.GetEngineNamespace(),
|
||||
serverApi.GetEngineSystemName(),
|
||||
"MobDieEvent", self, self.OnEntityDie)
|
||||
self.UnListenForEvent(serverApi.GetEngineNamespace(),
|
||||
serverApi.GetEngineSystemName(),
|
||||
"PlayerFishingServerEvent", self, self.OnFishing)
|
||||
self.UnListenForEvent(MOD_NAME, "ClientFeatureDispatcher",
|
||||
TAKEOUT_EVENT, self, self.OnTakeoutRequest)
|
||||
self.UnListenForEvent(MOD_NAME, "ClientFeatureDispatcher",
|
||||
@@ -666,6 +673,30 @@ class FeatureDispatcher(BlueFoxServerSystem):
|
||||
except Exception as e:
|
||||
print "[FD-OnEntityDie-ERR]", e
|
||||
|
||||
def OnFishing(self, args):
|
||||
"""
|
||||
玩家收杆时、钓鱼掉落物生成前触发(PlayerFishingServerEvent)。
|
||||
让 螃蟹(rtdd:crab)/龙虾(rtdd:lobster) 直接作为"钓上来的物品":
|
||||
有几率把本次钓上来的东西【替换】成 螃蟹 或 龙虾 —— 不再像 After 事件那样
|
||||
额外多掉一只, 更贴近原版"钓上来什么就是什么"。
|
||||
args.关键字段: playerId / hookEntity / itemList(本次钓上的物品列表, 生成前可改)。
|
||||
概率(草稿, 可调): 螃蟹 10% / 龙虾 6%。
|
||||
"""
|
||||
try:
|
||||
playerId = args.get("playerId")
|
||||
itemList = args.get("itemList")
|
||||
if not playerId or not isinstance(itemList, list) or not itemList:
|
||||
return
|
||||
# 【测试用】概率 100%: 每次收杆都替换成 螃蟹/龙虾(50/50), 方便验证两者都能钓到。
|
||||
# 测试完请调回(如 螃蟹0.10 / 龙虾0.06)。
|
||||
if random.random() < 0.5:
|
||||
sea = "rtdd:crab"
|
||||
else:
|
||||
sea = "rtdd:lobster"
|
||||
args["itemList"] = [{"itemName": sea, "count": 1, "auxValue": 0}]
|
||||
except Exception as e:
|
||||
print "[FD-OnFishing-ERR]", e
|
||||
|
||||
def OnDestroy(self, args):
|
||||
"""
|
||||
玩家拆方块时触发。
|
||||
|
||||
+8
@@ -37,6 +37,10 @@ from ....BlueFoxTools.ToolsConfig import LevelId
|
||||
# ---- 尸体生成延迟(秒): 死亡 1.5 秒后才生成尸体方块, 不会刚死瞬间就出现 ----
|
||||
GEN_DELAY = 1.5
|
||||
|
||||
# ---- 只有"被玩家攻击"死的才算: 近战=entity_attack, 远程(弓箭等)=projectile。
|
||||
# 排除 kill/指令(self_destruct) 以及摔/溺/火/爆炸等非玩家攻击的死亡。 ----
|
||||
ATTACK_CAUSES = {"entity_attack", "projectile"}
|
||||
|
||||
|
||||
class DeadmobGeneratorService(object):
|
||||
"""
|
||||
@@ -63,6 +67,10 @@ class DeadmobGeneratorService(object):
|
||||
attackerId = args.get("attacker") or args.get("attackedByEntId")
|
||||
if not killedId or not attackerId:
|
||||
return
|
||||
# 必须是"玩家攻击"死亡(近战 entity_attack / 远程 projectile)。
|
||||
# 排除 kill/指令(self_destruct) 及摔/溺/火等一切非玩家攻击的死亡。
|
||||
if args.get("cause") not in ATTACK_CAUSES:
|
||||
return
|
||||
# 解析"由玩家击杀": 近战 attacker 就是玩家; 远程 attacker 是抛射物, 取其发射者
|
||||
if not self._resolvePlayerAttacker(attackerId):
|
||||
return
|
||||
|
||||
@@ -63,6 +63,11 @@
|
||||
【空】 【空】 【空】
|
||||
【空】 【空】 【空】
|
||||
|
||||
● 挂肉钩(meathook)【有序】
|
||||
支撑杆
|
||||
铁锭
|
||||
(支杆=rtdd:support_rod)
|
||||
|
||||
########################################################################
|
||||
四、厨具 (xy_kitchenware)
|
||||
########################################################################
|
||||
@@ -383,6 +388,13 @@
|
||||
● 支撑杆(support_rod) x2 配方3【有序】(3 木板条)
|
||||
木板条 木板条 木板条
|
||||
|
||||
########################################################################
|
||||
二十、面食 (xy_mianshi) —— 新增
|
||||
########################################################################
|
||||
● 竹筒(bamboo_0)【有序】
|
||||
竹子 竹子 竹子
|
||||
(3 原版竹子 -> 1 竹筒, 供竹筒饭)
|
||||
|
||||
========================================================================
|
||||
附注
|
||||
========================================================================
|
||||
|
||||
Reference in new issue
Block a user