Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add precache_player_model #533

Open
wants to merge 6 commits into
base: master
Choose a base branch
from
Open
Changes from 5 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
28 changes: 28 additions & 0 deletions plugins/include/amxmisc.inc
Original file line number Diff line number Diff line change
Expand Up @@ -897,3 +897,31 @@ stock get_playersnum_ex(GetPlayersFlags:flags = GetPlayers_None, const team[] =
get_players_ex(_, PlayersNum, flags, team);
return PlayersNum;
}

/**
* Precaches a player model file.
*
* @note Can only be used inside of the plugin_precache() forward.
* @note Also searches for a "T.mdl" file and precaches that one as well if found.
* @note Player models MUST be placed in the following directory:
* "models/player/%name%/%name%.mdl" where "name" is the name of the model.
*
* @param name Name of the model file without the .mdl extension (e.g. "admin")
* @param id Variable to store the "T.mdl" cache id if found
*
* @return Unique cache id of the model
* @error If called outside of the plugin_precache() forward, an error is
* thrown from the precache_model() native.
*/
stock precache_player_model(const name[], &id = 0)
{
new model[128];
formatex(model, charsmax(model), "models/player/%s/%sT.mdl", name, name);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Some models have t.mdl instead of T.mdl, this can be a problem on OS with case-sensitive filesystem (like Linux) rehlds/ReHLDS@6715402.


if(file_exists(model))
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This is not the way how it should be checked, you need to check if model really needs it rehlds/ReHLDS@9080b9b#diff-462e3f794ed90c12c86f5d8d5b725c4aR5405.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@WPMGPRoSToTeMa Which I assume can't be done with a stock?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@OciXCrom it can be done through the reading of model file.

id = precache_generic(model);

static const extension[] = "T.mdl";

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

why static ?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@justgo97 It doesn't need to be defined more than once. It acts like a global variable with a local scope.

Copy link

@justgo97 justgo97 Aug 30, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

static is bad here because its lifetime (or "extent") is the entire run of the program while these stock will be only used in one forward.

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

static is fully OK for local array/string constants. There is no other option:

  1. new isn't appropriate here because it does copying on each function call.
  2. Global constant is bad because we use this constant only in this function, so there is no reason for it to be global.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

yeah but this string constant is pretty small in size and in its use having it static means it will stay in memory all the time while its only needed at the 1-2 seconds of map start for plugin_precache forward ?

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@justgo97 no, new = data + stack, static = data.

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@WPMGPRoSToTeMa I mean in overall which is better for memory ?

public plugin_init()
{
    func1()

    func2()
}

public func1()
{
    new const Block1[] = "I_M_GOING_TO_STAY_IN_MEMORY_JUST_FOR_THIS_FUNC"
    new const Block2[] = "I_M_GOING_TO_STAY_IN_MEMORY_JUST_FOR_THIS_FUNC"
    new const Block3[] = "I_M_GOING_TO_STAY_IN_MEMORY_JUST_FOR_THIS_FUNC"
    new const Block4[] = "I_M_GOING_TO_STAY_IN_MEMORY_JUST_FOR_THIS_FUNC"
    new const Block5[] = "I_M_GOING_TO_STAY_IN_MEMORY_JUST_FOR_THIS_FUNC"
    new const Block6[] = "I_M_GOING_TO_STAY_IN_MEMORY_JUST_FOR_THIS_FUNC"
}

public func2()
{
    static const Block1[] = "I_M_GOING_TO_STAY_IN_MEMORY_FOR_EVER"
    static const Block2[] = "I_M_GOING_TO_STAY_IN_MEMORY_FOR_EVER"
    static const Block3[] = "I_M_GOING_TO_STAY_IN_MEMORY_FOR_EVER"
    static const Block4[] = "I_M_GOING_TO_STAY_IN_MEMORY_FOR_EVER"
    static const Block5[] = "I_M_GOING_TO_STAY_IN_MEMORY_FOR_EVER"
    static const Block6[] = "I_M_GOING_TO_STAY_IN_MEMORY_FOR_EVER"
}

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@justgo97 if consider only permanent memory, then they are both the same.

Copy link

@justgo97 justgo97 Aug 31, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@WPMGPRoSToTeMa so for non-permanent memory new is better, which is an advantage for new over static ?

Copy link
Contributor

@rsKliPPy rsKliPPy Aug 31, 2018

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It doesn't matter, you shouldn't spend time deciding that while coding.

replace_string(model[charsmax(extension)], charsmax(model), extension, ".mdl");
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

charsmax isn't named good for this case, it would be better to have something like const_strlen.

return precache_model(model);
}