查看: 2284|回复: 4

[已经过期] 装备多类型(装备位、类型)的BUG

[复制链接]
梦石
0
星屑
9292
在线时间
2504 小时
注册时间
2011-5-20
回帖
14521

开拓者

发表于 2015-3-29 10:32:12 | 显示全部楼层 |阅读模式

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

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

×
本帖最后由 chd114 于 2015-3-28 23:48 编辑

首先放上脚本
设置部分
[pre lang="ruby"]=begin
给一个装备多种类型、位置分类,只有角色能使用一个装备下设定的所有类型的装备才能使用
=end
module Chd114 end
module Chd114::Equip#(武器ID为-1~999,防具ID为1~999)
  #装备位置(0为武器,1开始都是防具)
  Etype = {
  61=>[2],
  -1=>[],
  }
  #装备类型(武器类型为-1~-999,防具类型为1~999)
  Type = {
  }
end
(-999..999).each{|i|Chd114::Equip::Etype ||=[];Chd114::Equip::Type ||=[]}[/pre]
处理部分
[pre lang="ruby"]class Game_BattlerBase
  #--------------------------------------------------------------------------
  # ● 判定武器类型是否屏蔽
  #--------------------------------------------------------------------------
  def weapon_type_cover?(stype_id)
    cover_weapon.include?(stype_id)
  end
  #--------------------------------------------------------------------------
  # ● 判定防具类型是否屏蔽
  #--------------------------------------------------------------------------
  def armor_type_cover?(stype_id)
    cover_armor.include?(stype_id)
  end
  #--------------------------------------------------------------------------
  # ● 获取可用武器类型时除去屏蔽(删除)武器类型
  #--------------------------------------------------------------------------
  def add_weapon_types
    features_set(FEATURE_EQUIP_WTYPE).delete_if &method(:weapon_type_cover?)
  end
  #--------------------------------------------------------------------------
  # ● 获取可用防具类型时除去屏蔽(删除)防具类型
  #--------------------------------------------------------------------------
  def add_armor_types
    features_set(FEATURE_EQUIP_ATYPE).delete_if &method(:armor_type_cover?)
  end
  #--------------------------------------------------------------------------
  # ● 判定物品是否可以装备
  #--------------------------------------------------------------------------
  def equippable?(item)
    return false if item.is_a?(RPG::Item)
    return false unless item.is_a?(RPG::EquipItem)
    return false if equip_type_sealed?(item.etype_id)
    etid = item.is_a?(RPG::Weapon)? -item.wtype_id : item.atype_id
    cetid = item.is_a?(RPG::Weapon)?  -item.id : item.id
    cet=Chd114::Equip::Type[cetid].push(etid)
    equipcan=0
    for i in cet
      if i<0
      equipcan+=1 if equip_wtype_ok?(-i) && !weapon_type_cover?(-i)
      else
      equipcan+=1 if equip_atype_ok?(i) && !armor_type_cover?(i)
      end
    end
    return true if equipcan==cet.size
    return false
  end
end

class Game_Actor
  #--------------------------------------------------------------------------
  # ● 实例变量
  #--------------------------------------------------------------------------
  attr_writer   :cover_weapon               # 屏蔽武器类型
  attr_writer   :cover_armor                # 屏蔽防具类型
  #--------------------------------------------------------------------------
  # ○ 屏蔽装备类型取得
  #--------------------------------------------------------------------------
  def cover_weapon
    @cover_weapon = [] if @cover_weapon == nil
    return @cover_weapon
  end
  def cover_armor
    @cover_armor = [] if @cover_armor == nil
    return @cover_armor
  end
  #--------------------------------------------------------------------------
  # ● 更换装备
  #     slot_id : 装备栏 ID
  #     item    : 武器/护甲(为 nil 时装备解除)
  #--------------------------------------------------------------------------
  def change_equip(slot_id, item)
    return unless trade_item_with_party(item, equips[slot_id])
    if item!=nil
      cetid = item.is_a?(RPG::Weapon)? -item.id : item.id
      cet=Chd114::Equip::Etype[cetid].push(item.etype_id)
      return if item && !cet.include?(slot_id)
    end
    @equips[slot_id].object = item
    refresh
  end
  #--------------------------------------------------------------------------
  # ● 卸下无法装备的物品
  #     item_gain : 卸下的装备是否保留
  #--------------------------------------------------------------------------
  def release_unequippable_items(item_gain = true)
    @equips.each_with_index do |item, i|
      if item.object!=nil
        cetid = item.is_a?(RPG::Weapon)? -item.object.id : item.object.id
        cet=Chd114::Equip::Etype[cetid].push(item.object.etype_id)
        if !equippable?(item.object) || !cet.include?(equip_slots)
          trade_item_with_party(nil, item.object) if item_gain
          item.object = nil
        end
      end
    end
  end
end

class Window_EquipItem < Window_ItemList
  #--------------------------------------------------------------------------
  # ● 查询使用列表中是否含有此物品
  #--------------------------------------------------------------------------
  def include?(item)
    return true if item == nil
    return false unless item.is_a?(RPG::EquipItem)
    return false if @slot_id < 0
    cetid = item.is_a?(RPG::Weapon)? -item.id : item.id
    cet=Chd114::Equip::Etype[cetid].push(item.etype_id)
    return false if !cet.include?(@actor.equip_slots[@slot_id])
    return @actor.equippable?(item)
  end

end[/pre]
设置部分如上,其他未动,BUG如此图
QQ截图20150329164710.png
布衣是1号防具,小斧是1号武器,如果一个角色同时装备过这两种装备,那么作为防具的布衣就可以装备到武器上···
@三途亚梦 遇到过这种问题吗?





旧版备份
处理部分
[pre lang="ruby"]class Game_BattlerBase
  #--------------------------------------------------------------------------
  # ● 判定武器类型是否屏蔽
  #--------------------------------------------------------------------------
  def weapon_type_cover?(stype_id)
    cover_weapon.include?(stype_id)
  end
  #--------------------------------------------------------------------------
  # ● 判定防具类型是否屏蔽
  #--------------------------------------------------------------------------
  def armor_type_cover?(stype_id)
    cover_armor.include?(stype_id)
  end
  #--------------------------------------------------------------------------
  # ● 获取可用武器类型时除去屏蔽(删除)武器类型
  #--------------------------------------------------------------------------
  def add_weapon_types
    features_set(FEATURE_EQUIP_WTYPE).delete_if &method(:weapon_type_cover?)
  end
  #--------------------------------------------------------------------------
  # ● 获取可用防具类型时除去屏蔽(删除)防具类型
  #--------------------------------------------------------------------------
  def add_armor_types
    features_set(FEATURE_EQUIP_ATYPE).delete_if &method(:armor_type_cover?)
  end
  #--------------------------------------------------------------------------
  # ● 判定物品是否可以装备
  #--------------------------------------------------------------------------
  def equippable?(item)
    return false if item.is_a?(RPG::Item)
    return false unless item.is_a?(RPG::EquipItem)
    return false if equip_type_sealed?(item.etype_id)
    etid = item.is_a?(RPG::Weapon)? -item.wtype_id : item.atype_id
    cetid = item.is_a?(RPG::Weapon)?  -item.id : item.id
    cet=Chd114::Equip::Type[cetid].push(etid)
    equipcan=0
    for i in cet
      if i<0
      equipcan+=1 if equip_wtype_ok?(-i) && !weapon_type_cover?(-i)
      else
      equipcan+=1 if equip_atype_ok?(i) && !armor_type_cover?(i)
      end
    end
    p equipcan
    p cet.size
    return true if equipcan==cet.size
    return false
  end
end

class Game_Actor
  #--------------------------------------------------------------------------
  # ● 实例变量
  #--------------------------------------------------------------------------
  attr_writer   :cover_weapon               # 屏蔽武器类型
  attr_writer   :cover_armor                # 屏蔽防具类型
  #--------------------------------------------------------------------------
  # ○ 屏蔽装备类型取得
  #--------------------------------------------------------------------------
  def cover_weapon
    @cover_weapon = [] if @cover_weapon == nil
    return @cover_weapon
  end
  def cover_armor
    @cover_armor = [] if @cover_armor == nil
    return @cover_armor
  end
end

class Window_EquipItem < Window_ItemList
  #--------------------------------------------------------------------------
  # ● 查询使用列表中是否含有此物品
  #--------------------------------------------------------------------------
  def include?(item)
    return true if item == nil
    return false unless item.is_a?(RPG::EquipItem)
    return false if @slot_id < 0
    cetid = item.is_a?(RPG::Weapon)? -item.id : item.id
    cet=Chd114::Equip::Etype[cetid].push(item.etype_id)
    return false if !cet.include?(@actor.equip_slots[@slot_id])
    return @actor.equippable?(item)
  end
  
end[/pre]
设置部分
[pre lang="ruby"]=begin
给一个装备多种类型、位置分类,只有角色能使用一个装备下设定的所有类型的装备才能使用
=end
module Chd114 end
module Chd114::Equip#(武器ID为-1~999,防具ID为1~999)
  Etype = {#装备位置
  #-1=>[2],
  61=>[1],
  }
  Type = {#装备类型(武器类型为-1~-999,防具类型为1~999)
  #61=>[2],
  #-1=>[1],
  }
end
  
(-999..999).each{|i|Chd114::Equip::Etype ||=[];Chd114::Equip::Type ||=[]}[/pre]
这是楼主自己做的类似之前的一个技能多个类型的东西···
目前的BUG是:当同时设定了多种类型的防具在非数据库设定的防具装备位置上装备的话装备上去的防具会变成原来的装备位置上的(比如拿项链替换木盾,背包会多一个木盾,但是项链还是减少了,身上带的依然是木盾···)
@VIPArcher OWO

评分

参与人数 1星屑 +2 收起 理由
我是大仙 + 2 无理取闹

查看全部评分

[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2015-3-29 10:48:09 | 显示全部楼层
自己找判断「装备类型能否装上的部分」,一个一个改掉

@三途亚梦  大概知道有哪些
回复

使用道具 举报

梦石
0
星屑
9292
在线时间
2504 小时
注册时间
2011-5-20
回帖
14521

开拓者

 楼主| 发表于 2015-3-29 11:39:45 | 显示全部楼层
taroxd 发表于 2015-3-28 17:48
自己找判断「装备类型能否装上的部分」,一个一个改掉

@三途亚梦  大概知道有哪些  ...

修改了Game_Actor里面的以后这个BUG消失了···然后脱掉装备的地方会有问题(装备数据库设置里不属于该装备位的装备时脱下这个装备位上的装备)

  1.   #--------------------------------------------------------------------------
  2.   # ● 卸下无法装备的物品
  3.   #     item_gain : 卸下的装备是否保留
  4.   #--------------------------------------------------------------------------
  5.   def release_unequippable_items(item_gain = true)
  6.     @equips.each_with_index do |item, i|
  7.     cetid = item.is_a?(RPG::Weapon)? -item.object_id : item.object_id
  8.     p item#.object_id
  9.     p Chd114::Equip::Etype[cetid]
  10.     cet=Chd114::Equip::Etype[cetid].push(item.object.etype_id)
  11.    
  12.       if !equippable?(item.object) || !cet.include?(equip_slots[i])
  13.         trade_item_with_party(nil, item.object) if item_gain
  14.         item.object = nil
  15.       end
  16.     end
  17.   end
复制代码
object_id和id不一样但是直接取id会出错···
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复

使用道具 举报

闇吼者の災悪眷族

梦石
0
星屑
1366
在线时间
2881 小时
注册时间
2014-7-29
回帖
6408
发表于 2015-3-29 14:05:21 | 显示全部楼层
我做的是让装备任意位置可装备,然后在物品栏筛选的时候做了改变而已,所以并不会对这些方法产生什么影响呢。

评分

参与人数 1星屑 +110 收起 理由
丿梁丶小柒 + 110 我很赞同

查看全部评分

回复

使用道具 举报

梦石
0
星屑
9292
在线时间
2504 小时
注册时间
2011-5-20
回帖
14521

开拓者

 楼主| 发表于 2015-3-29 16:34:20 | 显示全部楼层
三途亚梦 发表于 2015-3-28 21:05
我做的是让装备任意位置可装备,然后在物品栏筛选的时候做了改变而已,所以并不会对这些方法产生 ...

我的和你的有点区别呢···你的和dota的6格装差不多(dota1的法球效果是放最前面的法球有效果,后面的无效,所以也是位置不同法球不同了···)

点评

就是说你那实际上是三个看起来一样实际效果不同的装备?  发表于 2015-3-29 17:27
我的主副手是根据备注判断,如果装备是单手持用的,根据装备位置的id,将装备上去的物品的id+1,卸下来的时候再-1变回去。本质上是3个不同的装备  发表于 2015-3-29 17:04
你那个主手副手才有效的特性和dota的法球其实可以算一个东西···主楼我编辑了下现在的情况···你遇到过这种没有···  发表于 2015-3-29 16:58
我才没有那么高级的法球的区别,就是单纯的任意位置可装备,但是玩家在更换装备的时候物品栏会做额外的筛选,所以玩家不能把斧头装在头上。  发表于 2015-3-29 16:55
[img]http://service.t.sina.com.cn/widget/qmd/5339802982/c02e16bd/7.png
回复

使用道具 举报

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

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部