广告广告
  加入我的最爱 设为首页 风格修改
首页 首尾
 手机版   订阅   地图  繁体 
您是第 478 个阅读者
 
发表文章 发表投票 回覆文章
  可列印版   加为IE收藏   收藏主题   上一主题 | 下一主题   
11922911
个人头像
个人文章 个人相簿 个人日记 个人地图
特殊贡献奖 社区建设奖
初露锋芒
级别: 初露锋芒 该用户目前不上站
推文 x44 鲜花 x96
分享: 转寄此文章 Facebook Plurk Twitter 版主评分版主评分版主评分 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片
推文 x2
[插件] 方便从 JSON 读取游戏资源档案的 API v0.2 (非OO版本) [2024.11.13 更新]  (避免写死档案位置)
【插件资讯】

插件来源:原创
使用指令:没有
安装路径:addons/amxmodx

【插件介绍】

需求: AMXX 1.9 或以上

这是跟我之前发布的 Asset Manager 差不多的功能 (点我进帖子), 但之前的设计有些缺憾和搞得太复杂, 所以我重做了一个非OO的版本
简单来说这就是一个 JSON 的 API 方便来读取游戏的资源档案位置给插件使用 避免写死在插件

asset_api.inc 放在 scripting/include
asset_api.sma 需要加在 plugins.ini
asset_api_test.sma 是测试插件
configs/test.json 是测试用的JSON

#include <asset_api> 来使用

二楼会有使用范例

以下是 INC 一览:
复制程式
// 游戏资源类型
enum AssetType
{
       Asset_Model,               // 模组 (例如: .mdl, .spr)
       Asset_Sound,               // 音效 (例如: .wav)
       Asset_Generic,               // 通用 (例如: .wav, .mp3, .txt, ...)
       Asset_PlayerModel        // 玩家模型
};

复制程式
/*
 * 会在使用 asset_loadJson 或 asset_passJson 时被呼叫
 *
 * @param json                      JSON 物件
 * @param name                      识别名字
 * @param filePath               档案位置
 * 
 * @noreturn
 */
forward asset_OnHandleJson(JSON:json, const name[], const filePath[]);

复制程式
/*
 * 载入 JSON
 *
 * @param name                      用以识别的名字
 * @param filePath               要读取的档案位置
 * @param relativePath        如果是 true 使用相对的位置 (amxmodx/configs) 否则将使用绝对位置
 * 
 * @return                            0 代表载入失败, 1 代表载入成功
 */
native asset_loadJson(const name[], const filePath[], bool:relativePath=true);

复制程式
/*
 * 传递 JSON 物件到 asset_OnHandleJson (forward 会被呼叫一次)
 *
 * @note 用这个如果你的JSON物件之前已经载入了一次
 *
 * @param json                      JSON 物件
 * @param name                      用以识别的名字
 * @param filePath               档案位置 (可留空)
 * 
 * @noreturn
 */
native asset_passJson(JSON:json, const name[], const filePath[]="");

复制程式
/*
 * 读取 JSON 物件的游戏资源到字串 (会自动预载)
 *
 * @param type                      游戏资源的类型
 * @param json                      JSON 物件
 * @param key                      要被读取的键值
 * @param string               输出到的字串
 * @param length              字串长度
 * @param defaultFile        当 JSON 物件没有读取到东西就使用这个档案 (可留空)
 * @param dotNotation        JSON 使用 dot notation
 * @param useValveFs        使用 valve 的档案系统 (意思是包含 valve/ 里面的档案)
 * 
 * @return                             回传 precache 的 id (0 为失败)
 */
stock asset_toString(
       AssetType:type, JSON:json, const key[], string[]="", length=0, 
       const defaultFile[]="", bool:dotNotation=true, bool:useValveFs=true)

复制程式
/*
 * 读取 JSON 物件的游戏资源到动态阵列 (会自动预载)
 *
 * @param type                      游戏资源的类型
 * @param json                      JSON 物件
 * @param key                      要被读取的键值
 * @param stringLength       字串长度 (ArrayCreate)
 * @param defaultFile        当 JSON 物件没有读取到东西就使用这个档案 (可留空)
 * @param dotNotation        JSON 使用 dot notation
 * @param useValveFs        使用 valve 的档案系统 (意思是包含 valve/ 里面的档案)
 * 
 * @return                             回传 Array: 的 handle
 */
stock Array:asset_toArray(
       AssetType:type, JSON:json, const key[], stringLength,
       const defaultFile[]="", bool:dotNotation=true, bool:useValveFs=true)

复制程式
/*
 * 预载游戏资源
 *
 * @param type                      游戏资源的类型
 * @param file                     档案位置
 * @param useValveFs        使用 valve 的档案系统 (意思是包含 valve/ 里面的档案)
 * 
 * @return                             回传 precache 的 id
 */
stock asset_precache(AssetType:type, const file[], bool:useValveFs=true)


本帖包含附件
zip Asset-API-AMXX.zip   (2024-11-13 12:45 / 5 KB)   下载次数:0


[ 此文章被11922911在2024-11-13 12:45重新编辑 ]

此文章被评分,最近评分记录
财富:500 (by amore12) | 理由: 辛苦了!!



YouTube: @holla16
献花 x2 回到顶端 [楼 主] From:香港没有资料 | Posted:2024-10-12 00:22 |
11922911
个人头像
个人文章 个人相簿 个人日记 个人地图
特殊贡献奖 社区建设奖
初露锋芒
级别: 初露锋芒 该用户目前不上站
推文 x44 鲜花 x96
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

使用范例:

插件
复制程式
#include <amxmodx>
#include <cstrike>
#include <engine>
#include <fakemeta>
#include <hamsandwich>
#include <asset_api>

new Array:g_soundSpk;
new g_soundEmit[64];
new g_playerModel[32];
new g_knifeModel[64];
new g_sprDisk;

public plugin_precache()
{
       // 载入 JSON
       // 若载入失败它也会至少以 Invalid_JSON 来呼叫一次 asset_OnHandleJson 来预载预设的资源档案
       asset_loadJson("test", "test.json")
}

public asset_OnHandleJson(JSON:json, const name[])
{
       // 检查识别的名字
       if (!equal(name, "test")) return;

       // 载入 spk 音效
       g_soundSpk = asset_toArray(Asset_Generic, json, "spk", 64, 
              .defaultFile="sound/events/enemy_died.wav");

       // 载入 emit 音效
       asset_toString(Asset_Sound, json, "emit", g_soundEmit, charsmax(g_soundEmit), 
              .defaultFile="player/headshot1.wav");

       // 载入玩家模组
       asset_toString(Asset_PlayerModel, json, "playermodel", g_playerModel, charsmax(g_playerModel), 
              .defaultFile="terror");

       // 载入小刀模组
       asset_toString(Asset_Model, json, "v_knife", g_knifeModel, charsmax(g_knifeModel), 
              .defaultFile="models/v_knife.mdl");

       // 载入 SPR
       g_sprDisk = asset_toString(Asset_Model, json, "spr_disk",
              .defaultFile="sprites/zbeam1.spr");
}

public plugin_init()
{
       register_plugin("Asset API Test", "0.1", "holla");

       register_clcmd("test_spk",        "CmdTestSpk");
       register_clcmd("test_emit", "CmdTestEmit");
       register_clcmd("test_spr",  "CmdTestSpr");

       RegisterHam(Ham_Spawn,                      "player",               "OnPlayerSpawn_Post", 1);
       RegisterHam(Ham_Item_Deploy,        "weapon_knife", "OnKnifeDeploy_Post", 1);
}

public CmdTestSpk()
{
       ARRAY_RANDOM_STR(g_soundSpk, sound[64]) // 获得随机音效 (这是 INC 里面的 macro)
       client_cmd(0, "spk %s", sound); // 用 spk 方式播放
}

public CmdTestEmit(id)
{
       // 用 emit_sound 播放音效在玩家身上
       emit_sound(id, CHAN_AUTO, g_soundEmit, VOL_NORM, ATTN_NORM, 0, PITCH_NORM);
}

public CmdTestSpr(id)
{
       new origin[3];
       get_user_origin(id, origin, 3);
       origin[2] += 1;

       message_begin(MSG_BROADCAST ,SVC_TEMPENTITY) //message begin
       write_byte(TE_BEAMDISK)
       write_coord(origin[0]) // center position
       write_coord(origin[1])
       write_coord(origin[2])
       write_coord(origin[0]) // axis and radius
       write_coord(origin[1])
       write_coord(origin[2] + 250)
       write_short(g_sprDisk) // sprite index
       write_byte(0) // starting frame
       write_byte(0) // frame rate in 0.1's
       write_byte(10) // life in 0.1's
       write_byte(10) // line width in 0.1's
       write_byte(0) // noise amplitude in 0.01's
       write_byte(0) //colour
       write_byte(100)
       write_byte(200)
       write_byte(255) // brightness
       write_byte(0) // scroll speed in 0.1's
       message_end()
}

public OnPlayerSpawn_Post(id)
{
       if (!is_user_alive(id)) return;

       cs_set_user_model(id, g_playerModel); // 改变玩家模组
}

public OnKnifeDeploy_Post(ent)
{
       if (!is_valid_ent(ent)) return;

       new id = get_ent_data_entity(ent, "CBasePlayerItem", "m_pPlayer");
       if (id)
              entity_set_string(id, EV_SZ_viewmodel, g_knifeModel); // 改变小刀模组
}

测试用的 JSON 设定档
复制程式
{
    "spk": ["sound/hostage/hos1.wav", "sound/hostage/hos2.wav", "sound/hostage/hos3.wav"],
    "emit": "scientist/scream1.wav",
    "playermodel": "vip",
    "v_knife": "models/v_knife_r.mdl",
    "spr_disk": "sprites/laserbeam.spr"
}




假如你的东西在JSON是写了在一个物件里面, 像这样
复制程式
{
       "object" : {
              "test_model" : "models/head.mdl"
       }
}

因为支援 dot notation, 所以你可以这样写
复制程式
asset_toString(Asset_Model, json, "object.test_model", g_testModel, charsmax(g_testModel));


[ 此文章被11922911在2024-11-13 12:44重新编辑 ]


YouTube: @holla16
献花 x0 回到顶端 [1 楼] From:香港没有资料 | Posted:2024-10-12 00:22 |
11922911
个人头像
个人文章 个人相簿 个人日记 个人地图
特殊贡献奖 社区建设奖
初露锋芒
级别: 初露锋芒 该用户目前不上站
推文 x44 鲜花 x96
分享: 转寄此文章 Facebook Plurk Twitter 复制连结到剪贴簿 转换为繁体 转换为简体 载入图片

2024.11.13 更新版本 v0.2
修正无效 precache id 判定由 0 改为 -1 (因为发现 precache id 由 0 开始)
现在 asset_loadJson 载入失败也会强制以 Invalid_JSON 来呼叫一次 asset_OnParseJson, 以防 defaultFile 没有被预载
修正 asset_toString 的 legnth 少于 1 时总是会回传 0
asset_OnParseJson 改名为 asset_OnHandleJson


[ 此文章被11922911在2024-11-13 12:44重新编辑 ]


YouTube: @holla16
献花 x0 回到顶端 [2 楼] From:香港没有资料 | Posted:2024-11-13 11:30 |

首页  发表文章 发表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.053349 second(s),query:16 Gzip disabled
本站由 瀛睿律师事务所 担任常年法律顾问 | 免责声明 | 本网站已依台湾网站内容分级规定处理 | 连络我们 | 访客留言