设为首页收藏本站|繁體中文

Project1

 找回密码
 注册会员
搜索
查看: 521|回复: 6
打印 上一主题 下一主题

[原创发布] 【脚本】吸血效果(通用吸血+技能吸血+暴击吸血)

[复制链接]

Lv3.寻梦者

梦石
0
星屑
3037
在线时间
388 小时
注册时间
2015-1-29
帖子
17
跳转到指定楼层
1
发表于 2026-3-6 21:26:27 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

加入我们,或者,欢迎回来。

您需要 登录 才可以下载或查看,没有帐号?注册会员

x
本帖最后由 SmallDrop 于 2026-3-12 16:34 编辑

RUBY 代码复制
  1. #==============================================================================
  2. # $SDrop$
  3. # 吸血效果 By猫易箱
  4. #------------------------------------------------------------------------------
  5. # 更新日志:
  6. #   支持 物理反击 和 魔法反射
  7. #------------------------------------------------------------------------------
  8. # 在 角色、职业、技能、武器、护甲、敌人、状态 备注使用:
  9. #
  10. #   <吸血A 20%>       - 通用吸血:让持有者造成伤害时,产生吸血效果
  11. #   <吸血B 20%>       - 技能吸血:技能专用!让技能自带吸血效果
  12. #   <吸血C 20%>       - 暴击吸血:A的变种,暴击时产生吸血效果
  13. #
  14. #   <吸血加成 100%>   - 攻击方的吸血修正(大于100%增加,小于100%减少)
  15. #   <吸血抗性 100%>   - 受击方的吸血修正(大于100%增加,小于100%减少)
  16. #
  17. #   吸血公式:伤害 × 吸血率 × 吸血加成 × 吸血抗性
  18. #   战斗消息显示:XXX受到了100点的伤害!被偷取了50HP!
  19. #
  20. #==============================================================================
  21.  
  22. $imported = {} if $imported.nil?
  23. $imported["SDrop_LifeSteal"] = true
  24.  
  25. #==============================================================================
  26. # ■ RPG::BaseItem
  27. #==============================================================================
  28. class RPG::BaseItem
  29.   #--------------------------------------------------------------------------
  30.   # ● 获取吸血A比率
  31.   #--------------------------------------------------------------------------
  32.   def life_steal_a_rate
  33.     @life_steal_a_rate ||= load_life_steal_a_rate
  34.   end
  35.  
  36.   #--------------------------------------------------------------------------
  37.   # ● 加载吸血A比率
  38.   #--------------------------------------------------------------------------
  39.   def load_life_steal_a_rate
  40.     self.note =~ /<吸血A\s*(\d+)%>/i ? $1.to_i / 100.0 : 0.0
  41.   end
  42.  
  43.   #--------------------------------------------------------------------------
  44.   # ● 获取吸血C比率(暴击时触发)
  45.   #--------------------------------------------------------------------------
  46.   def life_steal_c_rate
  47.     @life_steal_c_rate ||= load_life_steal_c_rate
  48.   end
  49.  
  50.   #--------------------------------------------------------------------------
  51.   # ● 加载吸血C比率
  52.   #--------------------------------------------------------------------------
  53.   def load_life_steal_c_rate
  54.     self.note =~ /<吸血C\s*(\d+)%>/i ? $1.to_i / 100.0 : 0.0
  55.   end
  56.  
  57.   #--------------------------------------------------------------------------
  58.   # ● 获取吸血修正倍率
  59.   #--------------------------------------------------------------------------
  60.   def life_steal_mod_rate
  61.     @life_steal_mod_rate ||= load_life_steal_mod_rate
  62.   end
  63.  
  64.   #--------------------------------------------------------------------------
  65.   # ● 加载吸血修正倍率
  66.   #--------------------------------------------------------------------------
  67.   def load_life_steal_mod_rate
  68.     self.note =~ /<吸血加成\s*(\d+)%>/i ? $1.to_i / 100.0 : 1.0
  69.   end
  70.  
  71.   #--------------------------------------------------------------------------
  72.   # ● 获取吸血抗性倍率
  73.   #--------------------------------------------------------------------------
  74.   def life_steal_resist_rate
  75.     @life_steal_resist_rate ||= load_life_steal_resist_rate
  76.   end
  77.  
  78.   #--------------------------------------------------------------------------
  79.   # ● 加载吸血抗性
  80.   #--------------------------------------------------------------------------
  81.   def load_life_steal_resist_rate
  82.     self.note =~ /<吸血抗性\s*(\d+)%>/i ? $1.to_i / 100.0 : 1.0
  83.   end
  84. end
  85.  
  86. #==============================================================================
  87. # ■ RPG::Skill
  88. #==============================================================================
  89. class RPG::Skill
  90.   #--------------------------------------------------------------------------
  91.   # ● 获取吸血B比率(技能单独使用)
  92.   #--------------------------------------------------------------------------
  93.   def life_steal_b_rate
  94.     @life_steal_b_rate ||= load_life_steal_b_rate
  95.   end
  96.  
  97.   #--------------------------------------------------------------------------
  98.   # ● 加载吸血B比率
  99.   #--------------------------------------------------------------------------
  100.   def load_life_steal_b_rate
  101.     self.note =~ /<吸血B\s*(\d+)%>/i ? $1.to_i / 100.0 : 0.0
  102.   end
  103. end
  104.  
  105. #==============================================================================
  106. # ■ Game_BattlerBase
  107. #==============================================================================
  108. class Game_BattlerBase
  109.   #--------------------------------------------------------------------------
  110.   # ● 获取总吸血A比率(从所有特性中累计)
  111.   #--------------------------------------------------------------------------
  112.   def life_steal_a_total
  113.     result = 0.0
  114.     feature_objects.each do |obj|
  115.       result += obj.life_steal_a_rate if obj.respond_to?(:life_steal_a_rate)
  116.     end
  117.     [[result, 1.0].min, 0.0].max
  118.   end
  119.  
  120.   #--------------------------------------------------------------------------
  121.   # ● 获取总吸血C比率(从所有特性中累计)
  122.   #--------------------------------------------------------------------------
  123.   def life_steal_c_total
  124.     result = 0.0
  125.     feature_objects.each do |obj|
  126.       result += obj.life_steal_c_rate if obj.respond_to?(:life_steal_c_rate)
  127.     end
  128.     [[result, 1.0].min, 0.0].max
  129.   end
  130.  
  131.   #--------------------------------------------------------------------------
  132.   # ● 获取总吸血加成倍率(所有修正倍率的乘积)
  133.   #--------------------------------------------------------------------------
  134.   def life_steal_mod_total
  135.     result = 1.0
  136.     feature_objects.each do |obj|
  137.       if obj.respond_to?(:life_steal_mod_rate)
  138.         result *= obj.life_steal_mod_rate
  139.       end
  140.     end
  141.     result
  142.   end
  143.  
  144.   #--------------------------------------------------------------------------
  145.   # ● 获取总吸血抗性倍率(所有抗性倍率的乘积)
  146.   #--------------------------------------------------------------------------
  147.   def life_steal_resist_total
  148.     result = 1.0
  149.     feature_objects.each do |obj|
  150.       if obj.respond_to?(:life_steal_resist_rate)
  151.         result *= obj.life_steal_resist_rate
  152.       end
  153.     end
  154.     result
  155.   end
  156. end
  157.  
  158. #==============================================================================
  159. # ■ Game_ActionResult
  160. #==============================================================================
  161. class Game_ActionResult
  162.   #--------------------------------------------------------------------------
  163.   # ● 定义实例变量
  164.   #--------------------------------------------------------------------------
  165.   attr_accessor :life_steal               # 吸血量
  166.   attr_accessor :life_steal_active         # 是否触发吸血
  167.   attr_accessor :life_steal_c_trigger      # 是否由暴击触发
  168.  
  169.   #--------------------------------------------------------------------------
  170.   # ● 初始化对象
  171.   #--------------------------------------------------------------------------
  172.   alias life_steal_initialize initialize
  173.   def initialize(battler)
  174.     life_steal_initialize(battler)
  175.     @life_steal = 0
  176.     @life_steal_active = false
  177.     @life_steal_c_trigger = false
  178.   end
  179.  
  180.   #--------------------------------------------------------------------------
  181.   # ● 清除
  182.   #--------------------------------------------------------------------------
  183.   alias life_steal_clear clear
  184.   def clear
  185.     life_steal_clear
  186.     @life_steal = 0
  187.     @life_steal_active = false
  188.     @life_steal_c_trigger = false
  189.   end
  190.  
  191.   #--------------------------------------------------------------------------
  192.   # ● 生成伤害
  193.   #--------------------------------------------------------------------------
  194.   alias life_steal_make_damage make_damage
  195.   def make_damage(value, item)
  196.     life_steal_make_damage(value, item)
  197.     @life_steal = @hp_damage if @hp_damage > 0 && @hp_drain == 0
  198.   end
  199.  
  200.   #--------------------------------------------------------------------------
  201.   # ● 获取HP伤害的文字(包含吸血信息)
  202.   #--------------------------------------------------------------------------
  203.   def hp_damage_text
  204.     if @life_steal_active && @hp_damage > 0
  205.       if @life_steal_c_trigger
  206.         # 暴击触发的吸血特殊显示
  207.         fmt = @battler.actor? ? "%s受到了%s点的伤害!被偷取了%sHP!" : "%s受到了%s点的伤害!被偷取了%sHP!"
  208.       else
  209.         fmt = @battler.actor? ? "%s受到了%s点的伤害!被偷取了%sHP!" : "%s受到了%s点的伤害!被偷取了%sHP!"
  210.       end
  211.       sprintf(fmt, @battler.name, @hp_damage, @life_steal)
  212.     elsif @hp_drain > 0
  213.       fmt = @battler.actor? ? Vocab::ActorDrain : Vocab::EnemyDrain
  214.       sprintf(fmt, @battler.name, Vocab::hp, @hp_drain)
  215.     elsif @hp_damage > 0
  216.       fmt = @battler.actor? ? Vocab::ActorDamage : Vocab::EnemyDamage
  217.       sprintf(fmt, @battler.name, @hp_damage)
  218.     elsif @hp_damage < 0
  219.       fmt = @battler.actor? ? Vocab::ActorRecovery : Vocab::EnemyRecovery
  220.       sprintf(fmt, @battler.name, Vocab::hp, -hp_damage)
  221.     else
  222.       fmt = @battler.actor? ? Vocab::ActorNoDamage : Vocab::EnemyNoDamage
  223.       sprintf(fmt, @battler.name)
  224.     end
  225.   end
  226. end
  227.  
  228. #==============================================================================
  229. # ■ Game_Action
  230. #==============================================================================
  231. class Game_Action
  232.   #--------------------------------------------------------------------------
  233.   # ● 获取技能/物品的总吸血率
  234.   #--------------------------------------------------------------------------
  235.   def total_life_steal_rate
  236.     rate = 0.0
  237.  
  238.     # 类型A:从所有特性中累计
  239.     rate += subject.life_steal_a_total
  240.  
  241.     # 类型B:从当前技能中获取(如果存在)
  242.     if item && item.respond_to?(:life_steal_b_rate)
  243.       rate += item.life_steal_b_rate
  244.     end
  245.  
  246.     # 类型C:暴击时触发,这里先记录,实际触发在item_apply中判断
  247.     @life_steal_c_rate = subject.life_steal_c_total
  248.  
  249.     [[rate, 1.0].min, 0.0].max
  250.   end
  251.  
  252.   #--------------------------------------------------------------------------
  253.   # ● 获取技能/物品的暴击吸血率
  254.   #--------------------------------------------------------------------------
  255.   def life_steal_c_rate
  256.     @life_steal_c_rate || 0.0
  257.   end
  258.  
  259.   #--------------------------------------------------------------------------
  260.   # ● 判定是否有吸血效果(普通吸血)
  261.   #--------------------------------------------------------------------------
  262.   def life_steal?
  263.     total_life_steal_rate > 0
  264.   end
  265.  
  266.   #--------------------------------------------------------------------------
  267.   # ● 判定是否有暴击吸血效果
  268.   #--------------------------------------------------------------------------
  269.   def life_steal_c?
  270.     life_steal_c_rate > 0
  271.   end
  272. end
  273.  
  274. #==============================================================================
  275. # ■ Game_Battler
  276. #==============================================================================
  277. class Game_Battler
  278.   #--------------------------------------------------------------------------
  279.   # ● 应用技能/物品的效果
  280.   #--------------------------------------------------------------------------
  281.   alias life_steal_item_apply item_apply
  282.   def item_apply(user, item)
  283.     # 记录吸血率
  284.     @life_steal_rate = 0
  285.     @life_steal_c_rate = 0
  286.     @life_steal_mod = 1.0
  287.     @life_steal_resist = 1.0
  288.  
  289.     # 获取吸血率 - 直接从user身上获取,不依赖于current_action
  290.     if user.respond_to?(:life_steal_a_total)
  291.       @life_steal_rate = user.life_steal_a_total
  292.     end
  293.  
  294.     # 技能吸血B(从技能本身获取)
  295.     if item && item.respond_to?(:life_steal_b_rate)
  296.       @life_steal_rate += item.life_steal_b_rate
  297.     end
  298.  
  299.     # 暴击吸血C
  300.     if user.respond_to?(:life_steal_c_total)
  301.       @life_steal_c_rate = user.life_steal_c_total
  302.     end
  303.  
  304.     # 吸血加成
  305.     if user.respond_to?(:life_steal_mod_total)
  306.       @life_steal_mod = user.life_steal_mod_total
  307.     end
  308.  
  309.     # 执行原处理(会调用make_damage_value)
  310.     life_steal_item_apply(user, item)
  311.  
  312.     # 处理吸血效果 - 使用最终伤害
  313.     damage_for_steal = @result.hp_damage
  314.  
  315.     if damage_for_steal > 0 && @result.hp_drain == 0
  316.       @life_steal_resist = self.life_steal_resist_total
  317.  
  318.       base_steal = 0
  319.       is_critical_steal = false
  320.  
  321.       if @life_steal_rate > 0
  322.         base_steal = (damage_for_steal * @life_steal_rate).to_i
  323.       end
  324.  
  325.       if @result.critical && @life_steal_c_rate > 0
  326.         c_steal = (damage_for_steal * @life_steal_c_rate).to_i
  327.         base_steal += c_steal
  328.         is_critical_steal = true
  329.       end
  330.  
  331.       if base_steal > 0
  332.         if @life_steal_mod != 1.0
  333.           base_steal = (base_steal * @life_steal_mod).to_i
  334.         end
  335.  
  336.         if @life_steal_resist != 1.0
  337.           base_steal = (base_steal * @life_steal_resist).to_i
  338.         end
  339.  
  340.         if base_steal > 0
  341.           @result.life_steal = base_steal
  342.           @result.life_steal_active = true
  343.           @result.life_steal_c_trigger = is_critical_steal
  344.  
  345.           user.hp += base_steal
  346.  
  347.           # 播放恢复音效(不喜欢的可自行修改或删除)
  348.           Sound.play_recovery if user.actor?
  349.         end
  350.       end
  351.     end
  352.  
  353.     @life_steal_rate = 0
  354.     @life_steal_c_rate = 0
  355.     @life_steal_mod = 1.0
  356.     @life_steal_resist = 1.0
  357.   end
  358. end
  359. #==============================================================================
  360. # ■ Window_BattleLog
  361. #==============================================================================
  362. class Window_BattleLog
  363.   #--------------------------------------------------------------------------
  364.   # ● 显示HP伤害
  365.   #--------------------------------------------------------------------------
  366.   def display_hp_damage(target, item)
  367.     return if target.result.hp_damage == 0 && item && !item.damage.to_hp?
  368.  
  369.     if target.result.hp_damage > 0 && target.result.hp_drain == 0 && !target.result.life_steal_active
  370.       target.perform_damage_effect
  371.     end
  372.  
  373.     Sound.play_recovery if target.result.hp_damage < 0
  374.     add_text(target.result.hp_damage_text)
  375.     wait
  376.   end
  377. end


在 角色、职业、技能、武器、护甲、敌人、状态 备注栏添加使用:

<吸血A 20%> 通用吸血:持有者造成伤害时,回复20%HP。

<吸血B 20%> 技能吸血:仅技能备注生效,使该技能造成伤害时回复20%HP。

<吸血C 20%> 暴击吸血:仅暴击时,触发吸血效果。

吸血A 吸血B 吸血C 可组合生效!

示例:

吸血A[10%] + 吸血B[20%] + 吸血C[30%]

角色 对 敌人 使用 吸血技能 同时 该技能暴击了,将会根据伤害吸取60%的HP

没有暴击,吸取30% ◆ 不是吸血技能,但暴击了40% ◆ 两者都不是,10%

注意!吸血ABC造成的吸血效果不会超过原伤害值

如果想“造成100的伤害,吸200的血”可以通过“吸血加成”和“吸血抗性”来实现

<吸血加成 100%>你的 角色/敌人 吸血时的效果修正 [110%等于+10%,90%等于-10%]

<吸血抗性 100%>你的 角色/敌人 被吸血时的效果修正 [90%等于+10%,110%等于-10%]

示例:

吸血A[50%] × 吸血加成[130%] × 吸血抗性[90%]

角色 对 敌人 造成任意伤害,都会吸取65%的HP

如果 敌人 有10%的吸血抗性,那就只会吸取59%的HP

战斗日志会显示吸了多少血
XXX受到了100点的伤害!被偷取了50HP!

评分

参与人数 1+1 收起 理由
BCJT + 1 精品文章

查看全部评分

Lv4.逐梦者

梦石
0
星屑
7034
在线时间
606 小时
注册时间
2017-11-10
帖子
720

极短21参与

2
发表于 2026-3-11 08:38:58 | 只看该作者
本帖最后由 BCJT 于 2026-3-11 09:01 编辑

效果很棒,但是在反击时好像没有效果,可能是我用了不兼容的脚本
回复 支持 反对

使用道具 举报

Lv3.寻梦者

梦石
0
星屑
3037
在线时间
388 小时
注册时间
2015-1-29
帖子
17
3
 楼主| 发表于 2026-3-12 16:10:30 | 只看该作者
BCJT 发表于 2026-3-11 08:38
效果很棒,但是在反击时好像没有效果,可能是我用了不兼容的脚本

现在可以了_(:з」∠)_

点评

多谢大佬,这脚本很实用,能实现很多效果!  发表于 2026-3-12 18:20
@BCJT 所以把后方的if user.actor?给删掉就好了  发表于 2026-3-12 17:59
第348行Sound.play_recovery if user.actor?的意思就是只有在角色的攻击触发吸血时才会播放回复的音效  发表于 2026-3-12 17:58
大佬,我又发现个问题:敌人的攻击触发吸血时没有回复的音效!!  发表于 2026-3-12 17:23

评分

参与人数 1+1 收起 理由
BCJT + 1 认可答案

查看全部评分

回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

拿上你的纸笔,建造一个属于你的梦想世界,加入吧。
 注册会员
找回密码

站长信箱:[email protected]|手机版|小黑屋|无图版|Project1游戏制作

GMT+8, 2026-6-4 16:50

Powered by Discuz! X3.1

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表