Неверный раздел форума
Не могу понять что не так с этим плагином. Загрузка модели идёт, а замены не происходит. В plugins ini оставил только стандартные плагины, так что конфликтов быть не может. Была таже самая проблема с custom_models плагином, в итоге пришлось всю ночь дописывать плагин который заменяется модельки по 3м флагам на 6. Тут я уже бессилен, помогите плс..
Установлено:
Server: 7559 MyArena Hosting
ReHLDS https://img.shields.io/github/v/release/dreamstalker/rehlds?include_prereleases
ReGameDLL https://img.shields.io/github/v/release/s1lentq/ReGameDLL_CS?include_prereleases
ReAPI https://img.shields.io/github/v/release/s1lentq/ReAPI?include_prereleases
Metamod-r https://img.shields.io/github/v/release/theAsmodai/metamod-r?include_prereleases
AMXModX https://img.shields.io/badge/release-v1.9.0.5291-blue
В replweapon.ini 1 строчка.
Установлено:
Server: 7559 MyArena Hosting
ReHLDS https://img.shields.io/github/v/release/dreamstalker/rehlds?include_prereleases
ReGameDLL https://img.shields.io/github/v/release/s1lentq/ReGameDLL_CS?include_prereleases
ReAPI https://img.shields.io/github/v/release/s1lentq/ReAPI?include_prereleases
Metamod-r https://img.shields.io/github/v/release/theAsmodai/metamod-r?include_prereleases
AMXModX https://img.shields.io/badge/release-v1.9.0.5291-blue
В replweapon.ini 1 строчка.
"t" "flags" "ak47" "models/imprs/vip/p_ak47.mdl" "models/imprs/vip/v_ak47.mdl" "models/imprs/vip/w_ak47.mdl"
Код:
#include <amxmodx>
#include <amxmisc>
#include <hamsandwich>
#include <fakemeta>
#include <engine>
#define PLUGIN "Weapon replace model"
#define VERSION "1.0"
#define AUTHOR "vk.com/CSPlugin"
enum _:STRWEAPON { //Для того что бы соотносить в файле прописи с реальным оружием.
WEAP_CSW,
WEAP_TEXT[14],
WEAP_NAME[20],
WEAP_MODELS[64]
}
new gWeapon[][STRWEAPON] = { //Список оружия, которое можно заменить.
{CSW_P228, "p228" , "weapon_p228" , "models/w_p228.mdl"},
{CSW_SCOUT, "scout" , "weapon_scout" , "models/w_scout.mdl"},
{CSW_HEGRENADE, "he" , "weapon_hegrenade", "models/w_hegrenade.mdl"},
{CSW_XM1014, "xm1014", "weapon_xm1014" , "models/w_xm1014.mdl"},
{CSW_MAC10, "mac10" , "weapon_mac10" , "models/w_mac10.mdl"},
{CSW_AUG, "aug" , "weapon_aug" , "models/w_aug.mdl"},
{CSW_ELITE, "elite" , "weapon_elite" , "models/w_elite.mdl"},
{CSW_FIVESEVEN, "fn57" , "weapon_fiveseven", "models/w_fiveseven.mdl"},
{CSW_UMP45, "ump45" , "weapon_ump45" , "models/w_ump45.mdl"},
{CSW_SG550, "sg550" , "weapon_sg550" , "models/w_sg550.mdl"},
{CSW_GALIL, "galil" , "weapon_galil" , "models/w_galil.mdl"},
{CSW_FAMAS, "famas" , "weapon_famas" , "models/w_famas.mdl"},
{CSW_USP, "usp" , "weapon_usp" , "models/w_usp.mdl"},
{CSW_GLOCK18, "glock" , "weapon_glock18" , "models/w_glock18.mdl"},
{CSW_AWP, "awp" , "weapon_awp" , "models/w_awp.mdl"},
{CSW_MP5NAVY, "mp5" , "weapon_mp5navy" , "models/w_mp5.mdl"},
{CSW_M249, "m249" , "weapon_m249" , "models/w_m249.mdl"},
{CSW_M3, "m3" , "weapon_m3" , "models/w_m3.mdl"},
{CSW_M4A1, "m4a1" , "weapon_m4a1" , "models/w_m4a1.mdl"},
{CSW_TMP, "tmp" , "weapon_tmp" , "models/w_tmp.mdl"},
{CSW_G3SG1, "g3sg1" , "weapon_g3sg1" , "models/w_g3sg1.mdl"},
{CSW_DEAGLE, "deagle", "weapon_deagle" , "models/w_deagle.mdl"},
{CSW_SG552, "sg552" , "weapon_sg552" , "models/w_sg552.mdl"},
{CSW_AK47, "ak47" , "weapon_ak47" , "models/w_ak47.mdl"},
{CSW_KNIFE, "knife" , "weapon_knife" , "models/w_knife.mdl"},
{CSW_P90, "p90" , "weapon_p90" , "models/w_p90.mdl"}
}
new bool:gRegHamItem[sizeof gWeapon]; //Что бы не регестрировать оружия которые не прописаны.
enum _:STRWEAPREAD { //Структура добавляемых моделей оружий.
WR_NUM, //Номер оружия в массиве gWeapon, для быстрого его поиска.
WR_SPARAM[64], //Параметр по которому сохранять.
WR_SPARTYPE, //Тип параметра сохранения.
WR_WEAPON[16], //Тип оружия соответсвует gWeapon[WEAP_TEXT], для определения номера WR_NUM
WR_MODELP[128], // новая _p модель
WR_MODELV[128], // новая _м модель
WR_MODELW[128] // новая _w модель
}
new Array:gArrWeapon; //Динамический массив для записи всех моделей.
//Для определения параметра сохранения и изменения порядка его приоритета.
enum _:STRSAVETYPE {
ST_FLAGS,
ST_STEAM,
ST_NAME
}
new gSzSType[][] = {
"flags",
"steam",
"name"
}
new gSType[] = {
ST_FLAGS,
ST_STEAM,
ST_NAME
}
enum PRIORITY { //Для того что бы при поиске оружий подходящих для замены игроку учитывать приоритет.
P_NUM,
P_PRIOR
}
new gPlWeap[33][sizeof gWeapon][PRIORITY]; //Массив для записи идентификаторов в динамич массиве для быстрого поиска при замене оружий.
//Читаем и кишируем
public ReadModels() {
gArrWeapon = ArrayCreate(STRWEAPREAD);
//Считываем из файла параметры
new filepatch[128],ArrWeapon[STRWEAPREAD],strSparType[16];
formatex(filepatch, charsmax(filepatch), "addons/amxmodx/configs/replweapon.ini")
if(!dir_exists("addons/amxmodx/configs")) {
mkdir("addons/amxmodx/configs");
}
if(file_exists(filepatch)) {
static buffer[512];
new iLine, iNum;
for(iLine = 0; read_file(filepatch, iLine, buffer, charsmax(buffer), iNum); iLine++) {
if(iNum > 0 && buffer[0] != '/' && buffer[1] != '/') {
trim(buffer);
// "name/steam/flags" "name|steam|flags" "weapon" "p" "v" "w"
parse(buffer,ArrWeapon[WR_SPARAM],charsmax(ArrWeapon[WR_SPARAM]),
strSparType,charsmax(strSparType),
ArrWeapon[WR_WEAPON],charsmax(ArrWeapon[WR_WEAPON]),
ArrWeapon[WR_MODELP],charsmax(ArrWeapon[WR_MODELP]),
ArrWeapon[WR_MODELV],charsmax(ArrWeapon[WR_MODELV]),
ArrWeapon[WR_MODELW],charsmax(ArrWeapon[WR_MODELW])
); //Парсим строки.
//Проверяем тип по которому прописана модель.
for(new i=0;i<sizeof(gSzSType);i++) {
if(equali(strSparType,gSzSType[i])) {
ArrWeapon[WR_SPARTYPE] = gSType[i];
}
}
//Проверяем наличие всех моделей, если какой то нет, значит не добавляем оружие.
new bool:isExists = true, pointer[3] = {
WR_MODELP,
WR_MODELV,
WR_MODELW
}
for(new i=0;i<sizeof(pointer);i++) {
if(!file_exists(ArrWeapon[pointer[i]])) {
isExists = false;
break;
}
}
if(isExists) { //Если все модели есть - кишируем и добавляем в систему.
//Ищем соответствие среди оружий.
for(new i=0;i<sizeof(gWeapon);i++) {
if(equali(ArrWeapon[WR_WEAPON],gWeapon[i][WEAP_TEXT])) {
gRegHamItem[i] = true;
ArrWeapon[WR_NUM] = i;
break;
}
}
engfunc(EngFunc_PrecacheModel,ArrWeapon[pointer[0]]);
engfunc(EngFunc_PrecacheModel,ArrWeapon[pointer[1]]);
engfunc(EngFunc_PrecacheModel,ArrWeapon[pointer[2]]);
ArrayPushArray(gArrWeapon,ArrWeapon);
}
}
}
} else {
new i=0;
write_file(filepatch, "// Это строка пример комментария", i++);
write_file(filepatch, "// Плагин замены моделей оружия по нику/стиму/флагу, ", i++);
write_file(filepatch, "// если игрок сразу подходит под несколько записей, модель будет заменена ", i++);
write_file(filepatch, "// на первую найденую запись с учётом приоритета (ник/стим/флаг).", i++);
write_file(filepatch, "// Формат прописи моделей:.", i++);
write_file(filepatch, "// ^"name/steam/flags^" ^"name|steam|flags^" ^"weapon^" ^"p^" ^"v^" ^"w^"", i++);
write_file(filepatch, "// Пример прописи (ник/стим/флаг):", i++);
write_file(filepatch, "// ^"vk.com/CSPlugin^" ^"name^" ^"ak47^" ^"models/menu/p_ak47.mdl^" ^"models/menu/v_ak47.mdl^" ^"models/menu/w_ak47.mdl^"", i++);
write_file(filepatch, "// ^"STEAM_0:4:1722678988^" ^"steam^" ^"ak47^" ^"models/menu/p_ak47.mdl^" ^"models/menu/v_ak47.mdl^" ^"models/menu/w_ak47.mdl^"", i++);
write_file(filepatch, "// ^"bcd^" ^"flags^" ^"ak47^" ^"models/menu/p_ak47.mdl^" ^"models/menu/v_ak47.mdl^" ^"models/menu/w_ak47.mdl^"", i++);
write_file(filepatch, "// Список оружий для которых можно заменить модели: ", i++);
new str[512],iLen = 0;
iLen+=formatex(str[iLen],charsmax(str) - iLen,"//");
for(new iweap = 0;iweap<sizeof(gWeapon);iweap++) {
iLen+=formatex(str[iLen],charsmax(str)-iLen,"%s,",gWeapon[iweap][WEAP_TEXT]);
}
write_file(filepatch, str, i++);
write_file(filepatch, "// ВНИМАНИЕ: Для ножа в _w моделе обязательно указать ЛЮБУЮ кешируемую модель в плагине.", i++);
}
}
public plugin_precache() {
ReadModels();
}
public plugin_init() {
register_plugin(PLUGIN, VERSION, AUTHOR);
register_forward(FM_SetModel, "fw_SetModel"); //Установка модели оружию на земле.
for(new weap=0;weap<sizeof(gWeapon);weap++) {
if(gRegHamItem[weap] && !equali(gWeapon[weap][WEAP_NAME],"weapon_knife")) { //Проверяем что это оружие прописано.
RegisterHam(Ham_Item_Deploy, gWeapon[weap][WEAP_NAME], "Ham_Deploy_Post", 1);
}
}
RegisterHam( Ham_Item_Deploy, "weapon_knife" , "ItemDeploy_Knife_Post", 1 ) //Для замени моделей ножей.
}
public client_putinserver(id) { //При входе сразу помечаем какие модели будут заменяться и на какие.
for(new i=0;i<sizeof(gPlWeap[]);i++) { //Обнуляем все данные прыдущего игрока.
gPlWeap[id][i][P_NUM] = -1;
gPlWeap[id][i][P_PRIOR] = -1; //Приоритет ставим -1, так как есть приоритет 0.
}
new iSize = ArraySize(gArrWeapon);
new ArrWeapon[STRWEAPREAD];
for(new num=0;num<iSize;num++) {
ArrayGetArray(gArrWeapon,num,ArrWeapon);
if(gPlWeap[id][ArrWeapon[WR_NUM]][P_PRIOR] < ArrWeapon[WR_SPARTYPE]) { //Сначала проверяем приоритет, так как для этого нужно меньше времени процессора.
if(is_par_value(id,ArrWeapon[WR_SPARTYPE],ArrWeapon[WR_SPARAM])) { //Если нашли совпадение по параметрам.
gPlWeap[id][ArrWeapon[WR_NUM]][P_NUM] = num; //Помечаем что для этого игрока, для этого оружия найдено совпадение.
gPlWeap[id][ArrWeapon[WR_NUM]][P_PRIOR] = ArrWeapon[WR_SPARTYPE]; //Устанавливаем текущий приоритет.
}
}
}
}
public is_par_value(id,szParam, szVariable[] ) { //Функция проверки совпадения по параметрам.
new szVar[64];
if(szParam == ST_NAME)
get_user_name(id, szVar, charsmax(szVar) );
if(szParam == ST_STEAM)
get_user_authid(id, szVar, charsmax(szVar))
if(equali(szVariable,szVar)) {
return true;
} else return false;
if(szParam == ST_FLAGS) {
if(get_user_flags(id) & read_flags(szVariable))
return true;
else
return false;
}
return false;
}
public fw_SetModel(entity, model[]) { //Замена модели на земле.
if(!is_valid_ent(entity))
return FMRES_IGNORED;
static szClassName[33];
entity_get_string(entity, EV_SZ_classname, szClassName, charsmax(szClassName));
if(!equal(szClassName, "weaponbox"))
return FMRES_IGNORED;
static iOwner;
iOwner = entity_get_edict(entity, EV_ENT_owner);
static iweaponID;
for(new iweap = 0;iweap<sizeof(gWeapon);iweap++) {
if(gPlWeap[iOwner][iweap][P_NUM] != -1) {
if(equal(model, gWeapon[iweap][WEAP_MODELS])) {
iweaponID = find_ent_by_owner(-1, gWeapon[iweap][WEAP_NAME], entity);
if(!is_valid_ent(iweaponID))
return FMRES_IGNORED;
static ArrWeapon[STRWEAPREAD];
ArrayGetArray(gArrWeapon,gPlWeap[iOwner][iweap][P_NUM],ArrWeapon);
entity_set_model(entity, ArrWeapon[WR_MODELW]);
return FMRES_SUPERCEDE;
}
}
}
return FMRES_IGNORED;
}
public Ham_Deploy_Post(ent) { //Замена модели в руках.
const XO_WEAPON = 4
const m_pPlayer = 41
new id = get_pdata_cbase( ent, m_pPlayer, XO_WEAPON );
replace_weapon_models(id);
}
replace_weapon_models(id) {
if(is_user_alive(id)) {
new weapon = get_pdata_int(get_pdata_cbase(id, 373, 5), 43, 4)
for(new iweap = 0;iweap<sizeof(gWeapon);iweap++) {
if(gPlWeap[id][iweap][P_NUM] != -1) {
if(weapon == gWeapon[iweap][WEAP_CSW]) {
static ArrWeapon[STRWEAPREAD];
ArrayGetArray(gArrWeapon,gPlWeap[id][iweap][P_NUM],ArrWeapon);
set_pev(id, pev_viewmodel2, ArrWeapon[WR_MODELV]);
set_pev(id, pev_weaponmodel2, ArrWeapon[WR_MODELP]);
}
}
}
}
}
public ItemDeploy_Knife_Post(ent) { //Меняем модели ножа.
const XO_WEAPON = 4
const m_pPlayer = 41
new id = get_pdata_cbase( ent, m_pPlayer, XO_WEAPON );
for(new iweap = 0;iweap<sizeof(gWeapon);iweap++) {
if(gPlWeap[id][iweap][P_NUM] != -1) {
if(gWeapon[iweap][WEAP_CSW] == CSW_KNIFE) {
static ArrWeapon[STRWEAPREAD];
ArrayGetArray(gArrWeapon,gPlWeap[id][iweap][P_NUM],ArrWeapon);
set_pev(id, pev_viewmodel2, ArrWeapon[WR_MODELV]);
set_pev(id, pev_weaponmodel2, ArrWeapon[WR_MODELP]);
}
}
}
}