骑马与砍杀中文站论坛

 找回密码
 注册(Register!)

QQ登录

只需一步,快速开始

搜索
购买CDKEY 小黑盒加速器
查看: 1525|回复: 5

[功能与代码] 让特殊武器只能使用特定弹药

[复制链接]

7

主题

46

回帖

36

积分

扈从

Rank: 2Rank: 2

UID
2898778
第纳尔
493
精华
0
互助
4
荣誉
0
贡献
0
魅力
5
注册时间
2017-11-25
鲜花(5) 鸡蛋(0)
发表于 2023-2-24 21:48:44 | 显示全部楼层 |阅读模式
本帖最后由 wei1786 于 2023-4-9 16:18 编辑

基本逻辑是切换武器时,把不能用的弹药类型存储起来,然后弹药量设为0,等使用这件武器时再把弹药信息拿出来。


记得好像有在中文站见过,找了半天没找着,就自己试着写了下。


其实现在还没写完,现在打开背包时弹药还不会恢复,虽然不影响补弹药但总归是不好看,发这个贴子也是想问问怎么以打开背包为触发条件。

代码部分:
slot:

slot_agent_weapon_1              = 30
slot_agent_weapon_2              = 31
slot_agent_weapon_3              = 32
slot_agent_weapon_4              = 33
slot_agent_weapon_num_1              = 34
slot_agent_weapon_num_2              = 35
slot_agent_weapon_num_3              = 36
slot_agent_weapon_num_4              = 37
slot_agent_last_weild_weapon         = 38
slot_agent_ammo_changed_1            = 39
slot_agent_ammo_changed_2            = 40
slot_agent_ammo_changed_3            = 41
slot_agent_ammo_changed_4            = 42

两个战场触发器,我目前火器只有两种类型,所以直接判断,类型比较多的话可以用slot存储一下弹药类型。

第一个是在开始时记录一下弹药量和拿着的武器。
火枪什么的在开始时会在弹夹里有额外弹药,要是把系统搞得比较复杂的话这个应该也要初始化一下。

common_init_item_slot = (
  ti_on_agent_spawn,0,ti_once,
  [],
  [
    (store_trigger_param_1, ":agent_no"),
    (agent_set_slot,":agent_no",slot_agent_defeat_enemy_num,0),#just add there
    (agent_set_slot,":agent_no",slot_agent_last_weild_weapon,-1),
    (try_for_range,":inv_no",0,4),
      (agent_get_item_slot,":cur_item",":agent_no",":inv_no"),
      (gt,":cur_item",0),
      (item_get_type,":cur_item_type",":cur_item"),
      (eq,":cur_item_type",itp_type_bullets),
      (agent_get_item_cur_ammo,":ammo",":agent_no",":inv_no"),
      (store_add,":slot_weapon",slot_agent_weapon_1,":inv_no"),
      (store_add,":slot_weapon_ammo",slot_agent_weapon_num_1,":inv_no"),
      (store_add,":slot_weapon_changed",slot_agent_ammo_changed_1,":inv_no"),
      (agent_set_slot,":agent_no",":slot_weapon",":cur_item"),
      (agent_set_slot,":agent_no",":slot_weapon_ammo",":ammo"),
      (agent_set_slot,":agent_no",":slot_weapon_changed",0),#not change
    (try_end),
  ]
)
更换武器时,更新弹药
我这里itm_heavy_muscket1,itm_heavy_muscket2和itm_cartridges1匹配
其他火器和itm_cartridges对应
common_init_item_in_battle = (#libwe
  0,0,0,
  [],
  [
    (try_for_agents,":agent_no"),
      (agent_get_troop_id,":troop_no",":agent_no"),
      (troop_is_hero,":troop_no"),
      
      # (agent_get_item_cur_ammo,":ammo",":agent_no",1),
      # (assign,reg1,":ammo"),
      # (display_message,"@{reg1}"),
      (agent_get_wielded_item,":item_no",":agent_no",0),
      (agent_get_slot,":last_weild",":agent_no",slot_agent_last_weild_weapon),

      (neq,":last_weild",":item_no"),#if change weapon, continue
      
      (agent_set_slot,":agent_no",slot_agent_last_weild_weapon,":item_no"),
      (gt, ":item_no", 0),
      (item_get_type,":item_type",":item_no"),
      (this_or_next|eq,":item_type",itp_type_pistol),
      (eq,":item_type",itp_type_musket),
      
      (try_begin),
        (display_message,"@weapon"),
        (this_or_next|eq,":item_no","itm_heavy_muscket1"),#heavey pistol
        (eq,":item_no","itm_heavy_muscket2"),

        (try_for_range,":inv_no",0,4),
          (agent_get_item_slot,":cur_item",":agent_no",":inv_no"),

          (store_add,":slot_weapon",slot_agent_weapon_1,":inv_no"),
          (store_add,":slot_weapon_ammo",slot_agent_weapon_num_1,":inv_no"),
          (store_add,":slot_weapon_changed",slot_agent_ammo_changed_1,":inv_no"),

          (try_begin),
            (gt,":cur_item",0),
          (else_try),
            (agent_get_slot,":cur_item",":agent_no",":slot_weapon"),
          (try_end),
          (gt,":cur_item",0),
          (item_get_type,":cur_item_type",":cur_item"),
          (eq,":cur_item_type",itp_type_bullets),

          (try_begin),
            (eq,":cur_item","itm_cartridges1"),
            (agent_get_slot,":is_changed",":agent_no",":slot_weapon_changed"),
            (eq,":is_changed",1),
            # (agent_get_slot,":item_no",":agent_no",":slot_weapon"),
            # (eq,":cur_item",":item_no"),
            (agent_get_slot,":ammo",":agent_no",":slot_weapon_ammo"),
            # (agent_set_ammo,":agent_no",":item_no",":ammo"),
            (store_add,":weapon_slot",":inv_no",1),
            (agent_equip_item,":agent_no",":cur_item",":weapon_slot"),
            (agent_set_ammo,":agent_no",":cur_item",":ammo"),
            (agent_set_slot,":agent_no",":slot_weapon_changed",0),
            (agent_set_slot,":agent_no",":slot_weapon",-1),
          (else_try),
            (eq,":cur_item","itm_cartridges"),
            (agent_get_item_cur_ammo,":ammo",":agent_no",":inv_no"),
            (agent_set_slot,":agent_no",":slot_weapon",":cur_item"),
            (agent_set_slot,":agent_no",":slot_weapon_ammo",":ammo"),
            # (agent_set_ammo,":agent_no",":cur_item",0),
            (store_add,":weapon_slot",":inv_no",1),
            (agent_unequip_item,":agent_no",":cur_item",":weapon_slot"),
            (agent_set_slot,":agent_no",":slot_weapon_changed",1),
          (try_end),
        (try_end),

      (else_try),#other pistol
        (try_for_range,":inv_no",0,4),
          (agent_get_item_slot,":cur_item",":agent_no",":inv_no"),
         
          (store_add,":slot_weapon",slot_agent_weapon_1,":inv_no"),
          (store_add,":slot_weapon_ammo",slot_agent_weapon_num_1,":inv_no"),
          (store_add,":slot_weapon_changed",slot_agent_ammo_changed_1,":inv_no"),

          (try_begin),
            (gt,":cur_item",0),
          (else_try),
            (agent_get_slot,":cur_item",":agent_no",":slot_weapon"),
          (try_end),
          (gt,":cur_item",0),
          (item_get_type,":cur_item_type",":cur_item"),
          (eq,":cur_item_type",itp_type_bullets),

          (try_begin),
            (eq,":cur_item","itm_cartridges1"),
            (agent_get_item_cur_ammo,":ammo",":agent_no",":inv_no"),
            (agent_set_slot,":agent_no",":slot_weapon",":cur_item"),
            (agent_set_slot,":agent_no",":slot_weapon_ammo",":ammo"),
            # (agent_set_ammo,":agent_no",":cur_item",0),
            (store_add,":weapon_slot",":inv_no",1),
            (agent_unequip_item,":agent_no",":cur_item",":weapon_slot"),
            (agent_set_slot,":agent_no",":slot_weapon_changed",1),
          (else_try),
            (eq,":cur_item","itm_cartridges"),
            (agent_get_slot,":is_changed",":agent_no",":slot_weapon_changed"),
            (eq,":is_changed",1),
            # (agent_get_slot,":item_no",":agent_no",":slot_weapon"),
            # (eq,":item_no",":cur_item"),
            (agent_get_slot,":ammo",":agent_no",":slot_weapon_ammo"),
            (store_add,":weapon_slot",":inv_no",1),
            (agent_equip_item,":agent_no",":cur_item",":weapon_slot"),
            (agent_set_ammo,":agent_no",":cur_item",":ammo"),
            # (agent_set_ammo,":agent_no",":item_no",":ammo"),
            (agent_set_slot,":agent_no",":slot_weapon_changed",0),
            (agent_set_slot,":agent_no",":slot_weapon",-1),
          (try_end),
        (try_end),

      (try_end),

    (try_end),

顺便问一下,把武器和弹药伤害设置成0的话好像还是会有一点点伤害,还是会加熟练度,有什么办法让伤害彻底为0吗?
武器的伤害和速度等如果设置为0的话是不会显示信息的,我在想能不能把一些武器的各种属性完全在战场触发器里面定义,然后通过给物品加额外信息和触发器仿造出一些新的伤害类型。


解决不了问题就解决出问题的东西,直接把箱子给删了然后允许按i呼出物品栏

common_open_inv_refill_ammmo = (
  ti_inventory_key_pressed, 0, 0,
      [(set_trigger_result,1)],#must open inv
      [
        (get_player_agent_no, ":agent_no"),
        (try_for_range,":inv_no",0,4),
          (agent_get_item_slot,":cur_item",":agent_no",":inv_no"),

          (store_add,":slot_weapon",slot_agent_weapon_1,":inv_no"),
          (store_add,":slot_weapon_ammo",slot_agent_weapon_num_1,":inv_no"),
          (store_add,":slot_weapon_changed",slot_agent_ammo_changed_1,":inv_no"),

          (le,":cur_item",0),
          (agent_get_slot,":cur_item",":agent_no",":slot_weapon"),
          (gt,":cur_item",0),

          (item_get_type,":cur_item_type",":cur_item"),
          (eq,":cur_item_type",itp_type_bullets),
          (agent_get_ammo_for_slot,":cur_ammo",":agent_no",":inv_no"),
          (eq,":cur_ammo",0),
          (agent_get_slot,":is_changed",":agent_no",":slot_weapon_changed"),
          (eq,":is_changed",1),
          # (agent_get_slot,":item_no",":agent_no",":slot_weapon"),
          # (eq,":item_no",":cur_item"),
          (agent_get_slot,":ammo",":agent_no",":slot_weapon_ammo"),
          # (agent_set_ammo,":agent_no",":item_no",":ammo"),
          (store_add,":weapon_slot",":inv_no",1),
          (agent_equip_item,":agent_no",":cur_item",":weapon_slot"),
          (agent_set_ammo,":agent_no",":cur_item",":ammo"),
          (agent_set_slot,":agent_no",":slot_weapon",-1),
          (agent_set_slot,":agent_no",":slot_weapon_changed",0),
          (agent_set_slot,":agent_no",slot_agent_last_weild_weapon,-1),
        (try_end),
      ])
删箱子直接把随机场景的scene_prop文件删了,然后加上(来自rubik的战前选择场景大小)
(0, 0, ti_once, [], [(assign,"$g_battle_won",0),
                          ## CC
                           (try_begin),

                            (try_begin),

                           # banner
                             (troop_get_slot, ":troop_banner_object", "trp_player", slot_troop_banner_scene_prop),
                             (try_begin),
                               (gt, ":troop_banner_object", 0),
                               # banner pole
                               (position_move_y, pos1, -200),
                               (position_set_z_to_ground_level, pos1),
                               (set_spawn_position, pos1),
                               (spawn_scene_prop, "spr_banner_pole", 0),
                               # banner
                               (position_move_z, pos1, 320),
                               (set_spawn_position, pos1),
                               (spawn_scene_prop, ":troop_banner_object", 0),
                             (try_end),
                           (try_end),
                          ## CC
                           (assign,"$defender_reinforcement_stage",0),
                           (assign,"$attacker_reinforcement_stage",0),
                           (call_script, "script_place_player_banner_near_inventory"),
                           (call_script, "script_combat_music_set_situation_with_culture"),
                           (assign, "$g_defender_reinforcement_limit", 2),
                           ]),

有个bug,如果武器类型中有可以单手使用,且只有这一件武器,关闭背包后会自动使用这个武器。
而不知道出于什么原因我的代码对这个时候掏出的武器无效。。。

2023.4.9更新了一下,之前是把弹药设为0,现在是直接移除,不会让普通手枪弹夹里的弹药变成什么乱七八糟的东西了,不过还是有瑕疵就是。
我是懒得记录弹药的前缀了,现在应该是会自动清理前缀,想改的话参考记录武器加slot吧。

评分

参与人数 2第纳尔 +20 互助 +1 魅力 +1 收起 理由
幼稚园殺手 + 10 + 1 文章不错,继续努力!
vegetto + 10 + 1 文章不错,继续努力!

查看全部评分

7

主题

46

回帖

36

积分

扈从

Rank: 2Rank: 2

UID
2898778
第纳尔
493
精华
0
互助
4
荣誉
0
贡献
0
魅力
5
注册时间
2017-11-25
鲜花(5) 鸡蛋(0)
 楼主| 发表于 2023-2-24 22:26:31 | 显示全部楼层
目前只要不开背包换东西就没问题,开背包后还是一堆bug

0

主题

4

回帖

1

积分

平民

Rank: 1

UID
3486704
第纳尔
21
精华
0
互助
0
荣誉
0
贡献
0
魅力
0
注册时间
2023-2-18
鲜花(0) 鸡蛋(0)
发表于 2023-2-25 00:43:34 来自手机 | 显示全部楼层
写个触发器,装备某武器,一直检测身上弹药是否是特定弹药,不是的话移除掉该弹药。来自: Android客户端

7

主题

46

回帖

36

积分

扈从

Rank: 2Rank: 2

UID
2898778
第纳尔
493
精华
0
互助
4
荣誉
0
贡献
0
魅力
5
注册时间
2017-11-25
鲜花(5) 鸡蛋(0)
 楼主| 发表于 2023-2-25 10:02:27 | 显示全部楼层
阿格兰 发表于 2023-2-25 00:43
写个触发器,装备某武器,一直检测身上弹药是否是特定弹药,不是的话移除掉该弹药。

然后移除了换可以用的武器你怎么拿回来?

31

主题

209

回帖

187

积分

见习骑士

Rank: 3

UID
2462463
第纳尔
1582
精华
0
互助
23
荣誉
0
贡献
0
魅力
83
注册时间
2015-3-3
鲜花(57) 鸡蛋(0)
发表于 2023-3-5 20:14:52 来自手机 | 显示全部楼层
wei1786 发表于 2023-2-25 10:02
然后移除了换可以用的武器你怎么拿回来?

不满足触发换弹药的武器,就不触发该触发器?来自: Android客户端

7

主题

46

回帖

36

积分

扈从

Rank: 2Rank: 2

UID
2898778
第纳尔
493
精华
0
互助
4
荣誉
0
贡献
0
魅力
5
注册时间
2017-11-25
鲜花(5) 鸡蛋(0)
 楼主| 发表于 2023-3-6 14:23:53 | 显示全部楼层
战争傀儡阿格兰 发表于 2023-3-5 20:14
不满足触发换弹药的武器,就不触发该触发器?

不需要触发,记录一下武器就行
您需要登录后才可以回帖 登录 | 注册(Register!)

本版积分规则

Archiver|手机版|小黑屋|骑马与砍杀中文站

GMT+8, 2024-11-19 10:21 , Processed in 0.121624 second(s), 24 queries , Gzip On, MemCached On.

Powered by Discuz! X3.4 Licensed

© 2001-2023 Discuz! Team.

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