11922911
|
分享:
▼
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)
[ 此文章被11922911在2024-11-13 12:45重新编辑 ]
此文章被评分,最近评分记录财富:500 (by amore12) | 理由: 辛苦了!! | |
|
|
|
YouTube: @holla16
|
x2
[楼 主]
From:香港没有资料 | Posted:2024-10-12 00:22 |
|
|
11922911
|
分享:
▲
▼
使用范例:插件 复制程式
#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 |
|
|
|