廣告廣告
  加入我的最愛 設為首頁 風格修改
首頁 首尾
 手機版   訂閱   地圖  簡體 
您是第 3405 個閱讀者
 
發表文章 發表投票 回覆文章
  可列印版   加為IE收藏   收藏主題   上一主題 | 下一主題   

頭像
個人文章 個人相簿 個人日記 個人地圖
路人甲
級別: *
推文 x 鮮花 x
分享: 轉寄此文章 Facebook Plurk Twitter 版主評分版主評分版主評分 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片
推文 x4
[插件] [OO] 資源管理器 API v0.3 (避免寫死檔案位置在程式碼之中) [2024-6-19 更新]  (model, sound, sprite, generic)
原創文章

此文章被評分,最近評分記錄
財富:500 (by amore12) | 理由: 辛苦了!!


獻花 x3 回到頂端 [樓 主] | Posted:2024-05-16 05:16 |
11922911
個人頭像
個人文章 個人相簿 個人日記 個人地圖
特殊貢獻獎 社區建設獎
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x46 鮮花 x101
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

看到以上的程式碼你可能會想, 那不是每一個插件也要弄一個 json? 表情
其實不是, 你可以只在一個插件中讀取一次json, 再把那個資源物件的id 分享給其他插件使用

以下是使用 XVar 把物件 id 分享給其他插件的方法

需要載入 json 的插件這樣寫:
複製程式
#include <amxmodx>
#include <oo_assets>

public Assets:AssetsObject;

public plugin_precache()
{
       AssetsObject = oo_new("Assets");
       AssetsLoadJson(AssetsObject, "assets/test.json");
}

用於簡化程序的一個stock function (可寫在你的自定義inc中)
複製程式
stock any:GetXVarObject(const name[])
{
       new xvar = get_xvar_id(name);
       if (xvar == -1)
              set_fail_state("XVar does not exist: %s", name);
       
       new any:object = get_xvar_num(xvar);
       if (!oo_object_exists(object))
              set_fail_state("Object does not exist: %d", object);

       return object;
}

這是其他插件A:
複製程式
new Assets:g_oAssets;

public plugin_init()
{
       g_oAssets = GetXVarObject("AssetsObject");
       register_clcmd("test_mp3", "CmdTestMp3");
}

public CmdTestMp3(id)
{
       static music[64];
       if (AssetsGetRandomGeneric(g_oAssets, "music", music, charsmax(music)))
              client_cmd(id, "mp3 play %s", music);
       
       return PLUGIN_HANDLED;
}

這是其他插件B:
複製程式
new Assets:g_oAssets;

public plugin_init()
{
       g_oAssets = GetXVarObject("AssetsObject");
       register_clcmd("test_spk", "CmdTestSpk");
}

public CmdTestSpk(id)
{
       static spk[64];
       if (AssetsGetRandomGeneric(g_oAssets, "spk", spk, charsmax(spk)))
              client_cmd(id, "spk %s", spk);
       
       return PLUGIN_HANDLED;
}

JSON檔案設定 (這只是個範例)
複製程式
{
       "generics" : {
              "music" : "sound/test/resident_evil.mp3",
              "spk" : "sound/test/door_stuck.wav"
       }
}

XVar 的詳細使用方法可以看看 a78 大的教學


[ 此文章被11922911在2024-06-19 15:03重新編輯 ]

此文章被評分,最近評分記錄
威望:5 (by amore12) | 理由: 辛苦了!!


獻花 x2 回到頂端 [1 樓] From:香港沒有資料 | Posted:2024-05-16 05:25 |
11922911
個人頭像
個人文章 個人相簿 個人日記 個人地圖
特殊貢獻獎 社區建設獎
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x46 鮮花 x101
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

如果擔心效能問題其實可以有一些應對方案
譬如在 plugin_init() 一開始就預先用一個變數來獲取某個檔案, 以後就用那個變數來設定 (只針對 model 或 sprite)
複製程式
new g_KnifeModel[64];
new g_ShockwaveSpr;
...
public plugin_init()
{
       ...
       AssetsGetModel(g_oAssets, "v_knife", g_KnifeModel, charsmax(g_KnifeModel));
       g_ShockwaveSpr = AssetsGetSprite(g_oAssets, "shockwave");
}

public OnKnifeDeploy_Post(ent)
{
       ...
       if (g_KnifeModel[0])
              set_pev(player, pev_viewmodel2, g_KnifeModel);
}

public OnWorldSpawnTraceAttack_Post(ent, attacker, Float:damage, Float:direction[3], tr, damagebits)
{
       ...
       if (g_ShockwaveSpr)
       {
              message_begin_f(MSG_PVS, SVC_TEMPENTITY, origin);
              write_byte(TE_BEAMCYLINDER); // TE id
              ...
              write_short(g_ShockwaveSpr);
              message_end();
       }
}

而 sound 及 generic 則可以預先獲取 Array 的 handle
複製程式
new Array:g_aHitWallSound;
new Array:g_aSlashSound;
...
public plugin_init()
{
       ...
       g_aHitWallSound = AssetsGetSound(g_oAssets, "knife_hitwall");
       g_aSlashSound = AssetsGetGeneric(g_oAssets, "knife_spk");
}

複製程式
public OnEmitSound(id, channel, const sample[], Float:volume, Float:attn, flags, pitch)
{
       ...
       if (equal(sample[8], "knife_hitwall", 13))
       {
              if (g_aHitWallSound != Invalid_Array)
              {
                     static sound[64];
                     ArrayGetRandomString(g_aHitWallSound, sound, charsmax(sound));
                     emit_sound(id, channel, sound, volume, attn, flags, pitch);
                     return FMRES_SUPERCEDE;
              }
       }
       if (equal(sample[8], "knife_slash", 11))
       {
              if (g_aSlashSound != Invalid_Array)
              {
                     static sound[64];
                     ArrayGetRandomString(g_aSlashSound, sound, charsmax(sound));
                     client_cmd(0, "spk %s", sound);
                     return FMRES_SUPERCEDE;
              }
       }
}

複製程式
stock ArrayGetRandomString(Array:handle, sound[], maxlen)
{
       ArrayGetString(handle, random(ArraySize(handle)), sound, maxlen);
}


[ 此文章被11922911在2024-05-16 18:55重新編輯 ]

此文章被評分,最近評分記錄
支持度:100 (by amore12) | 理由: 辛苦了!!


獻花 x2 回到頂端 [2 樓] From:香港沒有資料 | Posted:2024-05-16 13:23 |
11922911
個人頭像
個人文章 個人相簿 個人日記 個人地圖
特殊貢獻獎 社區建設獎
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x46 鮮花 x101
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

更新版本 v0.2 (2024-5-30):
- 在 inc 加入了安全檢查, 檢查 this 物件是否為有效
- 在 Assets@GetSprite() 找不到指定 spr 時將原本 return -1 改為 return 0


[ 此文章被11922911在2024-06-19 13:40重新編輯 ]


獻花 x0 回到頂端 [3 樓] From:香港沒有資料 | Posted:2024-05-30 11:57 |
h84293451
數位造型
個人文章 個人相簿 個人日記 個人地圖
路人甲
級別: 帳號封鎖 該用戶目前不上站
推文 x0 鮮花 x0
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

回 覆 鎖 定 :

  此回覆已被鎖定,只有『管理員及回覆者』看的到 !!!




獻花 x0 回到頂端 [4 樓] From:台灣寬頻通訊顧問股份有限公司 | Posted:2024-06-09 01:55 |
11922911
個人頭像
個人文章 個人相簿 個人日記 個人地圖
特殊貢獻獎 社區建設獎
初露鋒芒
級別: 初露鋒芒 該用戶目前不上站
推文 x46 鮮花 x101
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片

更新版本 v0.3 (2024-6-19):
- 減少重複的代碼
- Assets@LoadJson 使用 log_amx() 取代原本的 abort()
- 加入檔案不存在的 log 訊息
- 加入 AssetsLoadJson() (比直接用 oo_call 更安全的方法)
- 加入 AssetsClone() 複製物件功能 (用法詳見下面)

附件已更新




在 0.3 版本你可以複製一個 Assets 物件的內容到另一個物件之中 (比重新載入一次相同的JSON速度更快)

用法:
複製程式
#include <amxmodx>
#include <oo_assets>

new Assets:g_Object1, Assets:g_Object2;

public plugin_precache()
{
       g_Object1 = oo_new("Assets"); // 建立物件1
       AssetsLoadJson(g_Object1, "assets/exmaple.json"); // 載入JSON

       g_Object2 = oo_new("Assets"); // 建立物件2
       AssetsClone(g_Object2, g_Object1); // 將 物件1 的內容複製到 物件2
}


[ 此文章被11922911在2024-06-19 15:04重新編輯 ]


獻花 x0 回到頂端 [5 樓] From:香港沒有資料 | Posted:2024-06-19 13:49 |

首頁  發表文章 發表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.011159 second(s),query:16 Gzip disabled
本站由 瀛睿律師事務所 擔任常年法律顧問 | 免責聲明 | 本網站已依台灣網站內容分級規定處理 | 連絡我們 | 訪客留言