撒尿指令

撒尿指令

这个mod让你可以使用/piss命令小便

杂项

/piss 模组

此模组添加了 /piss 命令,触发玩家排尿。该效果对所有玩家可见(全部在服务端处理;几乎没有客户端代码)。

功能

  • 输入命令 /piss 开始排尿。
  • 按住 Shift 可提前停止。
  • 再次输入 /piss 同样会停止当前排尿。
  • 液流朝玩家视线方向移动,并对方块碰撞做出反应。
  • 液流对实体有反应:击中目标时会停留在目标上,视觉轨迹会短暂跟随其移动。
  • 排尿约 5 秒后自动停止,玩家死亡或退出游戏时也会停止。
  • 效果在服务端处理,并对其他玩家可见。

弹道工作原理(每个游戏刻)

  1. 抛物线,不是物理模拟。 发射点——玩家臀部(player.position().add(0, 0.8, 0)),初速度——沿玩家视线方向(player.getLookAngle(),速度约 0.5–0.7),重力约 0.05/刻²。我们以大步长在约 12 个点上采样抛物线轨迹——射流的方块分布稀疏。

  2. 用玻璃方块而非粒子。 射流是一个 Display.BlockDisplay 池,包含整块黄色玻璃(Panes.GLASS_BLOCK,缩放约 0.13,无旋转——变换是全局且静态的),抛物线上每个可见点对应一个方块。每刻调整池大小以匹配点数,实体是移动(setPos)而非重建;setPosRotInterpolationDuration(4) 使客户端上的移动平滑且变慢。不使用粒子。

  3. 命中点。 使用相同的抛物线线段——对方块使用 level.clip(new ClipContext(from, to, ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE, player)),对实体使用 ProjectileUtil.getEntityHitResult(...)(线段被方块命中裁剪掉,玩家自身和射流的 Display 实体被排除在谓词之外)。首次命中 = 落点;我们不再进一步采样抛物线。

  4. 幽灵方块(水坑)。 在撞击点生成一个 Display.BlockDisplay,带有一个扁平面板(不是十字形):YELLOW_STAINED_GLASS_PANE,两侧相对面均设为 true,面向玩家(绕 Y 轴旋转 -yRot)。世界不被修改;显示实体按定义不具碰撞。

    • 淡入插值:生成时持续 12 刻;一刻后——目标变换为“更低更宽”(scale.y → ~0.15)。如果在生成刻设置,客户端会在单个数据包中同时收到两个状态而不会播放动画。
    • 经 12 刻(0.6 秒)后——entity.discard()。每 4 刻(GHOST_INTERVAL)生成一个新水坑。
    • 击中实体:水坑“粘附”——它记住目标及其位置偏移,每刻重新定位到其后方(setPosRotInterpolationDuration(2) 以求平滑)。
  5. 停止射流:计时器(100 刻 = 5 秒)、重复 /piss(切换)、Shift(服务端 player.isShiftKeyDown()——无需客户端按键绑定)、死亡、登出或维度切换。该命令不会向聊天或操作栏发送任何消息。