Помогите с Custom player models

Сообщения
8
Реакции
1
Ошибка
L 05/24/2024 - 16:36:01: Start of error session.
L 05/24/2024 - 16:36:01: Info (map "de_dust2") (file "addons/amxmodx/logs/error_20240524.log")
L 05/24/2024 - 16:36:01: Invalid index 0 (count: 0)
L 05/24/2024 - 16:36:01: [AMXX] Run time error 10 (plugin "amxbans_core.amxx") (native "ArrayGetString") - debug not enabled!
L 05/24/2024 - 16:36:01: [AMXX] To enable debug mode, add "debug" after the plugin name in plugins.ini (without quotes).
Можеть быть и не этот
ОС
Windows
Amx Mod X
AMX Mod X 1.9.0.5271 (http://www.amxmodx.org)
Authors:
        David "BAILOPAN" Anderson, Pavol "PM OnoTo" Marko
        Felix "SniperBeamer" Geyer, Jonny "Got His Gun" Bergstrom
        Lukasz "SidLuke" Wlasinski, Christian "Basic-Master" Hammacher
        Borja "faluco" Ferrer, Scott "DS" Ehlert
Compiled: Jun 24 2020 13:53:30
Built from: https://github.com/alliedmodders/amxmodx/commit/5eea3e5
Build ID: 5271:5eea3e5
Core mode: JIT+ASM32
C++
Билд
Protocol version 48
Exe version 1.1.2.7/Stdio (cstrike)
ReHLDS version: 3.13.0.788-dev
Build date: 07:36:33 Jul 12 2023 (3378)
Build from: https://github.com/dreamstalker/rehlds/commit/f955b07
C++
ReGamedll
ReGameDLL version: 5.26.0.668-dev
Build date: 19:02:48 Dec 31 2023
Build from: https://github.com/s1lentq/ReGameDLL_CS/commit/d3c0ec8
C++
Версия Metamod
Metamod-r v1.3.0.131, API (5:13)
Metamod-r build: 18:51:02 Jul 11 2022
Metamod-r from: https://github.com/theAsmodai/metamod-r/commit/adc9414
C++
Список метамодулей
Currently loaded plugins:
      description    stat pend  file                        vers             src
  load  unload
 [ 1] Reunion        RUN   -    reunion_mm_i386.so          v0.1.0.92c       ini
  Start Never
 [ 2] ReAuthCheck    RUN   -    reauthcheck_mm_i386.so      v0.1.6           ini
  Start Never
 [ 3] AMX Mod X      RUN   -    amxmodx_mm_i386.so          v1.9.0.5271      ini
  Start ANY
 [ 4] WHBlocker      RUN   -    whblocker_mm_i386.so        v1.5.697         ini
  Chlvl ANY
 [ 5] ReSemiclip     RUN   -    resemiclip_mm_i386.so       v2.3.9           ini
  Chlvl ANY
 [ 6] Rechecker      RUN   -    rechecker_mm_i386.so        v2.5             ini
  Chlvl ANY
 [ 7] ReSRDetector   RUN   -    resrdetector_mm_i386.so     v0.1.0           ini
  Chlvl ANY
 [ 8] Fun            RUN   -    fun_amxx_i386.so            v1.9.0.5271      pl3
  ANY   ANY
 [ 9] Engine         RUN   -    engine_amxx_i386.so         v1.9.0.5271      pl3
  ANY   ANY
 [10] FakeMeta       RUN   -    fakemeta_amxx_i386.so       v1.9.0.5271      pl3
  ANY   ANY
 [11] CStrike        RUN   -    cstrike_amxx_i386.so        v1.9.0.5271      pl3
  ANY   ANY
 [12] CSX            RUN   -    csx_amxx_i386.so            v1.9.0.5271      pl3
  ANY   ANY
 [13] Ham Sandwich   RUN   -    hamsandwich_amxx_i386.so    v1.9.0.5271      pl3
  ANY   ANY
 [14] ReAPI          RUN   -    reapi_amxx_i386.so          v5.24.0.300-dev  pl3
  ANY   Never
 [15] ReAimDetector  RUN   -    reaimdetector_amxx_i386.so  v0.2.2           pl3
  ANY   Never
 [16] MySQL          RUN   -    mysql_amxx_i386.so          v1.9.0.5271      pl3
  ANY   ANY
16 plugins, 16 running
C++
Список плагинов
Currently loaded plugins:
       name                    version     author            file             st
atus
 [  1] Admin Loader            3.5         neygomon          admin.amxx       ru
nning
 [  2] Admin Chat              1.8.2       AMXX Dev Team     adminchat.amxx   ru
nning
 [  3] Admin Commands          1.8.2       AMXX Dev Team     admincmd.amxx    ru
nning
 [  4] Admin Help              1.8.2       AMXX Dev Team     adminhelp.amxx   ru
nning
 [  5] Admin Votes             1.8.2       AMXX Dev Team     adminvote.amxx   ru
nning
 [  6] Fake Ping               1.0         MeRcyLeZZ/gyxoBk  Ping.amxx        ru
nning
 [  7] AES: Bonus CSTRIKE      0.4         serfreeman1337    aes_bonus_cstri  ru
nning
 [  8] AES: Bonus System       0.2         serfreeman1337    aes_bonus_syste  ru
nning
 [  9] AES: Exp CSTRIKE        0.3         serfreeman1337    aes_exp_cstrike  ru
nning
 [ 10] AES: Experience Editor  0.1         serfreeman1337    aes_exp_editor.  ru
nning
 [ 11] AES: Informer           0.2         serfreeman1337    aes_informer.am  ru
nning
 [ 12] Advanced Experience Sy  0.4.1       serfreeman1337    aes_main.amxx    ru
nning
 [ 13] Anti Flood              1.8.2       AMXX Dev Team     antiflood.amxx   ru
nning
 [ 14] Csds Map                3.24        Deags/AMXX Commu  csds_map.amxx    ru
nning
 [ 15] Commands Menu           1.8.2       AMXX Dev Team     cmdmenu.amxx     ru
nning
 [ 16] unknown                 unknown     unknown           csstats.amxx     ru
nning
 [ 17] First Blood             0.1         Quasar            Firstblood.amxx  ru
nning
 [ 18] Info. Messages          1.8.2       AMXX Dev Team     imessage.amxx    ru
nning
 [ 19] Maps Menu               1.8.2       AMXX Dev Team     mapsmenu.amxx    ru
nning
 [ 20] Menus Front-End         1.8.2       AMXX Dev Team     menufront.amxx   ru
nning
 [ 21] CS Misc. Stats          1.8.2       AMXX Dev Team     miscstats.amxx   ru
nning
 [ 22] Multi-Lingual System    1.8.2       AMXX Dev Team     multilingual.am  ru
nning
 [ 23] NextMap                 1.8.2       AMXX Dev Team     nextmap.amxx     ru
nning
 [ 24] Pause Plugins           1.8.2       AMXX Dev Team     pausecfg.amxx    ru
nning
 [ 25] Players Menu            1.8.2       AMXX Dev Team     plmenu.amxx      ru
nning
 [ 26] Plugin Menu             1.8.2       AMXX Dev Team     pluginmenu.amxx  ru
nning
 [ 27] ReAimDetector API       0.2.2       ReHLDS Team       reaimdetector.a  ru
nning
 [ 28] Restrict Weapons        1.8.2       AMXX Dev Team     restmenu.amxx    ru
nning
 [ 29] StatsX (MastaMan Editi  1.8.1.3746  AMXX Dev Team &   statsx_shell.am  ru
nning
 [ 30] Scrolling Message       1.8.2       AMXX Dev Team     scrollmsg.amxx   ru
nning
 [ 31] Stats Configuration     1.8.2       AMXX Dev Team     statscfg.amxx    ru
nning
 [ 32] TFC Stats Logging       1.8.2       AMXX Dev Team     stats_logging.a  ru
nning
 [ 33] Teleport Menu           1.8.2       AMXX Dev Team     telemenu.amxx    ru
nning
 [ 34] Multi Jump              1.2         b0t.              MultiJump.amxx   ru
nning
 [ 35] Custom Player Models A  0.2.5       F@nt0M & BlackSi  custom_player_m  ru
nning
 [ 36] Custom Player Models C  0.2.2       BlackSignature    custom_player_m  ru
nning
 [ 37] Custom Player Models T  0.2.1       BlackSignature    custom_player_m  ru
nning
37 plugins, 37 running
C++
Автор плагина
BlackSignature
Версия плагина
0.2.5
Исходный код
CUSTOM PLAYER MODELS.ini
; 'Custom Player Models CFG' plugin configuration file
;
; Format: "access" "key" "tt_model" "tt_body" "ct_model" "ct_body" "expiration_time"
; Access can be:
; #%name% - For specified nickname. Example: #mx?! will set model for nickname 'mx?!' (w/o quotes)
; STEAM_... or VALVE_... for access by authid
; @ - For steam players
; * - For all
; Any other string - access flags ('any of' requirement)
;
; You can use empty access for external purpose (setting models by native from other plugins)
; Key MUST be unique for every row!
; 'Body' means submodel. Just set it to "0" if not sure.
; Note that auth by nickname is not password protected. Use auth by nickname+password in your admin loader.
; Use format '%d.%m.%Y %H:%M' for expiration time, or set it to "" to disable it.
;
; Note that comparing will work until first match, so rows with higher priority should be placed first (see example)
;
; Examples:
; "#mx?!" "maximka" "models/cpm/max.mdl" "0" "models/cpm/max.mdl "1" ""
; "STEAM_0:0:1234567" "splinter" "models/cpm/splinter_tt.mdl" "0" "models/cpm/splinter_ct.mdl" "0" ""
; "abcd" "krang" "models/cpm/krang_tt.mdl" "0" "models/cpm/krang_ct.mdl" "0" ""
; "@" "shreder" "models/cpm/shreder_tt.mdl" "0" "models/cpm/shreder_ct.mdl" "0" "20.04.2025"
; "*" "ninja_turtle" "models/cpm/ninja_turtle_tt.mdl" "0" "models/cpm/ninja_turtle_ct.mdl" "0" "20.04.2025 13:00"

"t" "freevip" "models/player/freevip/vip_tt.mdl" "0" "models/player/freevip/vip_ct.mdl" "0"

custom_player_models_api.sma :

#include <amxmodx>
#include <fakemeta>
#include <reapi>
#include "include/custom_player_models.inc"

// Support submodels (body). Comment to disable and save some CPU.
#define SUPPORT_BODY

#define CHECK_NATIVE_ARGS_NUM(%1,%2,%3) \
	if (%1 < %2) { \
		log_error(AMX_ERR_NATIVE, "Invalid num of arguments %d. Expected %d", %1, %2); \
		return %3; \
	}

#define CHECK_NATIVE_PLAYER(%1,%2) \
	if (!is_user_connected(%1)) { \
		log_error(AMX_ERR_NATIVE, "Invalid player %d", %1); \
		return %2; \
	}

enum _:model_s {
	MODEL_INDEX_TT,
	MODEL_TT[CPM_MAX_MODEL_LENGTH],
	MODEL_BODY_TT,
	MODEL_INDEX_CT,
	MODEL_CT[CPM_MAX_MODEL_LENGTH],
	MODEL_BODY_CT
};

enum _:player_s {
	bool:PLAYER_HAS_MODEL,
	bool:PLAYER_SEE_MODEL,
	PLAYER_MODEL_KEY[CPM_MAX_KEY_LENGTH],
	PLAYER_MODEL[model_s],
}

new Trie:Models = Invalid_Trie, Model[model_s];
new Players[MAX_PLAYERS + 1][player_s];

new Receiver;

public plugin_natives() {
	register_native("custom_player_models_register", "NativeRegister");
	register_native("custom_player_models_has", "NativeHas");
	register_native("custom_player_models_set", "NativeSet");
	register_native("custom_player_models_set_body", "NativeSetBody");
	register_native("custom_player_models_get_body", "NativeGetBody");
	register_native("custom_player_models_reset", "NativeReset");
	register_native("custom_player_models_enable", "NativeEnable");
	register_native("custom_player_models_is_enable", "NativeIsEnable");
}

public plugin_precache() {
	register_plugin("Custom Player Models API", "0.2.5", "F@nt0M & BlackSignature");

	new ret, fwd = CreateMultiForward("custom_player_models_init", ET_IGNORE);
	ExecuteForward(fwd, ret);
	DestroyForward(fwd);
}

public plugin_init() {
	if (Models != Invalid_Trie) {
		RegisterHookChain(RH_SV_WriteFullClientUpdate, "SV_WriteFullClientUpdate_Pre", false);
		register_forward(FM_AddToFullPack, "AddToFullPack_Post", true);

		if(find_plugin_byfile("rt_core.amxx", .ignoreCase = 0) == INVALID_PLUGIN_ID && find_plugin_byfile("revive_teammates.amxx", .ignoreCase = 0) == INVALID_PLUGIN_ID) {
			register_message(get_user_msgid("ClCorpse"), "MsgHookClCorpse")
		}
		else {
			log_amx("Plugin 'Revive Teammates' detected, ClCorpse message will not be registered!")
		}
	}
}

public plugin_end() {
	if (Models != Invalid_Trie) {
		TrieDestroy(Models);
	}
}

public client_connect(id) {
	clearPlayer(id);
}

public client_disconnected(id) {
	clearPlayer(id);
}

public SV_WriteFullClientUpdate_Pre(const client, const buffer, const receiver) {
	if(Receiver && receiver != Receiver) {
		return HC_SUPERCEDE;
	}

	if (Players[receiver][PLAYER_SEE_MODEL] && is_user_connected(client) && Players[client][PLAYER_HAS_MODEL]) {
		set_key_value(buffer, "model", "");
	}

	return HC_CONTINUE;
}

public AddToFullPack_Post(const handle, const e, const ent, const host, const hostflags, const player, const pSet) {
	if (!player || !Players[ent][PLAYER_HAS_MODEL] || !Players[host][PLAYER_SEE_MODEL] || !get_orig_retval()) {
		return;
	}

	switch (get_member(ent, m_iTeam)) {
		case TEAM_TERRORIST: {
			set_es(handle, ES_ModelIndex, Players[ent][PLAYER_MODEL][MODEL_INDEX_TT]);
		#if defined SUPPORT_BODY
			set_es(handle, ES_Body, Players[ent][PLAYER_MODEL][MODEL_BODY_TT]);
		#endif
		}

		case TEAM_CT: {
			set_es(handle, ES_ModelIndex, Players[ent][PLAYER_MODEL][MODEL_INDEX_CT]);
		#if defined SUPPORT_BODY
			set_es(handle, ES_Body, Players[ent][PLAYER_MODEL][MODEL_BODY_CT]);
		#endif
		}
	}
}

public MsgHookClCorpse() {
	enum {
		arg_model = 1,
		arg_origin_x,
		arg_origin_y,
		arg_origin_z,
		arg_angles_x,
		arg_angles_y,
		arg_angles_z,
		arg_delay,
		arg_sequence,
		arg_body,
		arg_team,
		arg_player,
	};

	new player = get_msg_arg_int(arg_player);
	if (!Players[player][PLAYER_HAS_MODEL]) {
		return PLUGIN_CONTINUE;
	}

	new team = get_msg_arg_int(arg_team);

	new key;

#if defined SUPPORT_BODY
	new custom_body;
#endif

	switch (team) {
		case TEAM_TERRORIST: {
			key = MODEL_TT;
		#if defined SUPPORT_BODY
			custom_body = Players[player][PLAYER_MODEL][MODEL_BODY_TT];
		#endif
		}

		case TEAM_CT: {
			key = MODEL_CT;
		#if defined SUPPORT_BODY
			custom_body = Players[player][PLAYER_MODEL][MODEL_BODY_CT];
		#endif
		}

		default: {
			return PLUGIN_CONTINUE;
		}
	}

	new model[CPM_MAX_MODEL_LENGTH], origin[3], Float:angles[3];
	get_msg_arg_string(arg_model, model, charsmax(model));

	origin[0] = get_msg_arg_int(arg_origin_x);
	origin[1] = get_msg_arg_int(arg_origin_y);
	origin[2] = get_msg_arg_int(arg_origin_z);

	angles[0] = get_msg_arg_float(arg_angles_x);
	angles[1] = get_msg_arg_float(arg_angles_y);
	angles[2] = get_msg_arg_float(arg_angles_z);

	new delay = get_msg_arg_int(arg_delay);
	new sequence = get_msg_arg_int(arg_sequence);

	new default_body = get_msg_arg_int(arg_body);

	static msgClCorpse;

	if(!msgClCorpse) {
		msgClCorpse = get_user_msgid("ClCorpse");
	}

	for (new id = 1; id <= MaxClients; id++) {
		if (!is_user_connected(id)) {
			continue;
		}

		message_begin(MSG_ONE, msgClCorpse, .player = id);
		if (Players[id][PLAYER_SEE_MODEL]) {
			write_string(Players[player][PLAYER_MODEL][key]);
		} else {
			write_string(model);
		}
		write_long(origin[0]);
		write_long(origin[1]);
		write_long(origin[2]);
		write_coord_f(angles[0]);
		write_coord_f(angles[1]);
		write_coord_f(angles[2]);
		write_long(delay);
		write_byte(sequence);
	#if defined SUPPORT_BODY
		if (Players[id][PLAYER_SEE_MODEL]) {
			write_byte(custom_body);
		} else {
			write_byte(default_body);
		}
	#else
		write_byte(default_body);
	#endif
		write_byte(team);
		write_byte(player);
		message_end();
	}

	return PLUGIN_HANDLED;
}

public bool:NativeRegister(const plugin, const argc) {
	enum { arg_key = 1, arg_model_tt, arg_body_tt, arg_model_ct, arg_body_ct };
	CHECK_NATIVE_ARGS_NUM(argc, arg_body_ct, false)

	new key[CPM_MAX_KEY_LENGTH];
	get_string(arg_key, key, charsmax(key));

	if (Models != Invalid_Trie && TrieKeyExists(Models, key)) {
		return true;
	}

	new model[CPM_MAX_MODEL_LENGTH];
	get_string(arg_model_tt, model, charsmax(model));

	if (!loadModel(model, MODEL_INDEX_TT, MODEL_TT)) {
		log_error(AMX_ERR_NATIVE, "Error precache %s", model);
		return false;
	}

	get_string(arg_model_ct, model, charsmax(model));

	if (!loadModel(model, MODEL_INDEX_CT, MODEL_CT)) {
		log_error(AMX_ERR_NATIVE, "Error precache %s", model);
		return false;
	}

	if (Models == Invalid_Trie) {
		Models = TrieCreate();
	}

	Model[MODEL_BODY_TT] = get_param(arg_body_tt);
	Model[MODEL_BODY_CT] = get_param(arg_body_ct);

	TrieSetArray(Models, key, Model, sizeof Model);
	return true;
}

public bool:NativeHas(const plugin, const argc) {
	enum { arg_player = 1, arg_key, arg_length };
	CHECK_NATIVE_ARGS_NUM(argc, arg_length, false)

	new player = get_param(arg_player);
	CHECK_NATIVE_PLAYER(player, false)

	if (!Players[player][PLAYER_HAS_MODEL]) {
		return false;
	}

	set_string(arg_key, Players[player][PLAYER_MODEL_KEY], get_param(arg_length));
	return true;
}

public bool:NativeSet(const plugin, const argc) {
	enum { arg_player = 1, arg_key };
	CHECK_NATIVE_ARGS_NUM(argc, arg_key, false)

	new player = get_param(arg_player);
	CHECK_NATIVE_PLAYER(player, false)

	new key[CPM_MAX_KEY_LENGTH];
	get_string(arg_key, key, charsmax(key));
	if (!TrieGetArray(Models, key, Model, sizeof Model)) {
		log_error(AMX_ERR_NATIVE, "Invalid key %s", key);
		return false;
	}

	Players[player][PLAYER_HAS_MODEL] = true;
	copy(Players[player][PLAYER_MODEL_KEY], CPM_MAX_KEY_LENGTH - 1, key);
	Players[player][PLAYER_MODEL] = Model;
	rh_update_user_info(player);
	return true;
}

public bool:NativeSetBody(const plugin, const argc) {
	enum { arg_player = 1, arg_team, arg_body };
	CHECK_NATIVE_ARGS_NUM(argc, arg_body, false)

	new player = get_param(arg_player);
	CHECK_NATIVE_PLAYER(player, false)

	new any:iTeam = get_param(arg_team);

	if( !(TEAM_SPECTATOR > iTeam > TEAM_UNASSIGNED) ) {
		log_error(AMX_ERR_NATIVE, "Invalid team %d", iTeam);
		return false;
	}

	new body = get_param(arg_body);

	new iSetTo = (iTeam == TEAM_TERRORIST) ? MODEL_BODY_TT : MODEL_BODY_CT;

	Players[player][PLAYER_MODEL][iSetTo] = body;
	return true;
}

public bool:NativeGetBody(const plugin, const argc) {
	enum { arg_player = 1, arg_team, arg_body };
	CHECK_NATIVE_ARGS_NUM(argc, arg_body, false)

	new player = get_param(arg_player);
	CHECK_NATIVE_PLAYER(player, false)

	new any:iTeam = get_param(arg_team);

	if( !(TEAM_SPECTATOR > iTeam > TEAM_UNASSIGNED) ) {
		log_error(AMX_ERR_NATIVE, "Invalid team %d", iTeam);
		return false;
	}

	if(!Players[player][PLAYER_HAS_MODEL]) {
		return false;
	}

	new iGetFrom = (iTeam == TEAM_TERRORIST) ? MODEL_BODY_TT : MODEL_BODY_CT;

	set_param_byref(arg_body, Players[player][PLAYER_MODEL][iGetFrom]);

	return true;
}

public bool:NativeReset(const plugin, const argc) {
	enum { arg_player = 1 };
	CHECK_NATIVE_ARGS_NUM(argc, arg_player, false)

	new player = get_param(arg_player);
	CHECK_NATIVE_PLAYER(player, false)

	Players[player][PLAYER_HAS_MODEL] = false;
	rh_update_user_info(player);
	return true;
}

public bool:NativeEnable(const plugin, const argc) {
	enum { arg_player = 1, arg_value };
	CHECK_NATIVE_ARGS_NUM(argc, arg_value, false)

	new player = get_param(arg_player);
	CHECK_NATIVE_PLAYER(player, false)

	Players[player][PLAYER_SEE_MODEL] = bool:get_param(arg_value);

	Receiver = player;

	for (new id = 1; id <= MaxClients; id++) {
		if (is_user_connected(id) && Players[id][PLAYER_HAS_MODEL] && is_entity(id)) { // is_entity() as botfix
			rh_update_user_info(id);
		}
	}

	Receiver = 0;

	return true;
}

public bool:NativeIsEnable(const plugin, const argc) {
	enum { arg_player = 1 };
	CHECK_NATIVE_ARGS_NUM(argc, arg_player, false)

	new player = get_param(arg_player);
	CHECK_NATIVE_PLAYER(player, false)

	return Players[player][PLAYER_SEE_MODEL];
}

bool:loadModel(const model[], const key_index, const key_model) {
	if (!file_exists(model, true)) {
		return false;
	}
	Model[key_index] = precache_model(model);
	copy(Model[key_model], CPM_MAX_MODEL_LENGTH - 1, model);
	return true;
}

clearPlayer(const id) {
	Players[id][PLAYER_HAS_MODEL] = false;
	Players[id][PLAYER_SEE_MODEL] = true;
	arrayset(Players[id][PLAYER_MODEL_KEY], 0, CPM_MAX_KEY_LENGTH - 1);
}

// https://github.com/ufame/ReviveTeammates --->

/**
* Called after the creation of the corpse is completed
*
* @param iEnt    corpse entity index
* @param id      id of the player whose corpse
* @param vOrigin  coordinates of the corpse
*
*/
public rt_creating_corpse_end(const iEnt, const id, const vOrigin[3]) {
	if(!Players[id][PLAYER_HAS_MODEL] || !is_entity(iEnt)) {
		return;
	}

	switch (get_member(id, m_iTeam)) {
		case TEAM_TERRORIST: {
			engfunc(EngFunc_SetModel, iEnt, Players[id][PLAYER_MODEL][MODEL_TT]);
		#if defined SUPPORT_BODY
			set_entvar(iEnt, var_body, Players[id][PLAYER_MODEL][MODEL_BODY_TT]);
		#endif
		}

		case TEAM_CT: {
			engfunc(EngFunc_SetModel, iEnt, Players[id][PLAYER_MODEL][MODEL_CT]);
		#if defined SUPPORT_BODY
			set_entvar(iEnt, var_body, Players[id][PLAYER_MODEL][MODEL_BODY_CT]);
		#endif
		}
	}
}

custom_player_models_cfg.sma

#include <amxmodx>
#include <reapi>
#include "include/custom_player_models.inc"

// Steam (flag '@') support, comment if you run steam-only server
#define STEAM_SUPPORT

// Config filename in 'amxmodx/configs'
#define CONFIG_FILENAME "custom_player_models.ini"
//#define CONFIG_FILENAME "custom_player_models/models.ini"

//#define DEBUG

#define MAX_AUTHID_LENGTH 64

enum _:access_s {
	ACCESS_AUTH[MAX_AUTHID_LENGTH],
	ACCESS_KEY[CPM_MAX_MODEL_LENGTH]
};

new Array:g_Models = Invalid_Array, g_Size;

public plugin_init() {
	register_plugin("Custom Player Models CFG", "0.2.2", "BlackSignature");

	RegisterHookChain(RG_CBasePlayer_GetIntoGame, "CBasePlayer_GetIntoGame_Post", true);
	RegisterHookChain(RG_CBasePlayer_SetClientUserInfoName, "CBasePlayer_SetClientUserInfoName_Post", true);

#if defined DEBUG
	register_clcmd("radio2", "CmdRadio2");
	register_clcmd("radio3", "CmdRadio3");
#endif
}

public custom_player_models_init() {
	new path[128];
	new len = get_localinfo("amxx_configsdir", path, charsmax(path));
	formatex(path[len], charsmax(path) - len, "/%s", CONFIG_FILENAME);
	new file = fopen(path, "rt");
	if (!file) {
		set_fail_state("Can't %s '%s'", file_exists(path) ? "read" : "find", path);
		return;
	}

	g_Models = ArrayCreate(access_s);

	new line[256], data[access_s], model_tt[64], body_tt[6], model_ct[64], body_ct[6], time[32];

	new systime = get_systime();

	while (!feof(file)) {
		fgets(file, line, charsmax(line));
		if (line[0] == EOS || line[0] == ';') {
			continue;
		}

		if (parse(line,
			data[ACCESS_AUTH], charsmax(data[ACCESS_AUTH]),
			data[ACCESS_KEY], charsmax(data[ACCESS_KEY]),
			model_tt, charsmax(model_tt),
			body_tt, charsmax(body_tt),
			model_ct, charsmax(model_ct),
			body_ct, charsmax(body_ct),
			time, charsmax(time)
		) != 7) {
			continue;
		}

		custom_player_models_register(data[ACCESS_KEY], model_tt, str_to_num(body_tt), model_ct, str_to_num(body_ct));

		if(data[ACCESS_AUTH][0] == EOS) {
			continue;
		}

	#if !defined STEAM_SUPPORT
		if(data[ACCESS_AUTH][0] == '@') {
			continue;
		}
	#endif

		if(time[0] && systime >= parse_time(time, "%d.%m.%Y %H:%M")) {
			continue
		}

		ArrayPushArray(g_Models, data);
	}

	fclose(file);

	g_Size = ArraySize(g_Models);
}

public CBasePlayer_GetIntoGame_Post(const id) {
	if(is_user_hltv(id)) {
		return;
	}

	// for client_putinserver()
	// redundant here? not sure about it
	if(is_user_bot(id) && !is_entity(id)) {
		RequestFrame("fix_bot", get_user_userid(id));
		return;
	}

	set_load_player(id);
}

public CBasePlayer_SetClientUserInfoName_Post(const id, const infobuffer[], const new_name[]) {
	RequestFrame("name_delay", id);
}

public name_delay(const id) {
	if(is_user_alive(id) && is_entity(id)) { // is_entity() as botfix, can be redundant
		set_load_player(id);
	}
}

set_load_player(const id) {
	new authid[MAX_AUTHID_LENGTH];
	if(get_user_authid(id, authid, charsmax(authid))) {
		load_player(id, authid);
	}
}

public fix_bot(const userid) {
	new id = find_player("k", userid);

	if(id) {
		load_player(id, "BOT");
	}
}

load_player(id, const authid[]) {
	new i, data[access_s], player_flags = get_user_flags(id);

	new szName[MAX_NAME_LENGTH];
	get_user_name(id, szName, charsmax(szName));

	for( ; i < g_Size; i++) {
		ArrayGetArray(g_Models, i, data);

		switch(data[ACCESS_AUTH][0]) {
			case '*': {
				break;
			}
		#if defined STEAM_SUPPORT
			case '@': {
				if(is_user_steam(id)) {
					break;
				}
			}
		#endif
			case 'S', 'V': {
				if(strcmp(authid, data[ACCESS_AUTH], .ignorecase = true) == 0) {
					break;
				}
			}
			case '#': {
				if(strcmp(szName, data[ACCESS_AUTH][1], .ignorecase = true) == 0) {
					break;
				}
			}
			default: {
				if(player_flags & read_flags(data[ACCESS_AUTH])) {
					break;
				}
			}
		}
	}

	new szKey[CPM_MAX_MODEL_LENGTH];
	new bool:bHas = custom_player_models_has(id, szKey, charsmax(szKey));

	if(i != g_Size) {
		if(!bHas || strcmp(szKey, data[ACCESS_KEY], .ignorecase = false) != 0) {
			custom_player_models_set(id, data[ACCESS_KEY]);
		}
	} else if(bHas) {
		custom_player_models_reset(id);
	}
}

public plugin_end() {
	if(g_Models != Invalid_Array) {
		ArrayDestroy(g_Models);
	}
}

#if defined DEBUG
	public CmdRadio2(const id) {
		if (custom_player_models_is_enable(id)) {
			client_print_color(id, print_team_grey, "^4Models ^3disabled");
			custom_player_models_enable(id, false);
		} else {
			client_print_color(id, print_team_blue, "^4Models ^3enabled");
			custom_player_models_enable(id, true);
		}
		return PLUGIN_HANDLED;
	}

	public CmdRadio3(const id) {
		new player;
		get_user_aiming(id, player);
		if (!is_user_connected(player)) {
			client_print_color(id, print_team_red, "^3Player not found");
			return PLUGIN_HANDLED;
		}

		if (custom_player_models_has(player)) {
			client_print_color(id, print_team_grey, "^4Model ^3reseted");
			custom_player_models_reset(player);
		} else {
			new data[access_s];
			ArrayGetArray(g_Models, random_num(0, g_Size - 1), data);
			custom_player_models_set(player, data[ACCESS_KEY]);
			client_print_color(id, print_team_blue, "^4Model ^3setted ^4[%s]", data[ACCESS_KEY]);
		}
		return PLUGIN_HANDLED;
	}
#endif
C++
Помогите пожалуйста не работает модели но плагин работает
 
Сообщения
284
Реакции
43
Помог
5 раз(а)
L 05/24/2024 - 16:36:01: Start of error session.
L 05/24/2024 - 16:36:01: Info (map "de_dust2") (file "addons/amxmodx/logs/error_20240524.log")
L 05/24/2024 - 16:36:01: Invalid index 0 (count: 0)
L 05/24/2024 - 16:36:01: [AMXX] Run time error 10 (plugin "amxbans_core.amxx") (native "ArrayGetString") - debug not enabled!
L 05/24/2024 - 16:36:01: [AMXX] To enable debug mode, add "debug" after the plugin name in plugins.ini (without quotes).
Можеть быть и не этот
 
Сообщения
8
Реакции
1
Murz, Не знаю можеть быть даже нету лога но не работает моделька
 
Сообщения
34
Реакции
1
illusion_Defender, в теории если он не правильно модель прописал бы. то не было бы ошибки.
у него просто бы не работала модель. может как вариант у него все кому прописал модели бы не отображали.
 
Сообщения
1,193
Реакции
90
Помог
15 раз(а)
Для начала надо было бы debug прописать
 
Сообщения
8
Реакции
1
Всё спасибо всем я установил новый плагин и всё работает
 

Пользователи, просматривающие эту тему

Сейчас на форуме нет ни одного пользователя.
Сверху Снизу