Escolar Documentos
Profissional Documentos
Cultura Documentos
You should have received a copy of the GNU General Public License
along with Entities Resources Replacement; if not, write to the
Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA.
*/
#include <amxmodx>
#include <amxmisc>
#include <orpheu>
#include <orpheu_memory>
#include <orpheu_advanced>
#include <fakemeta>
#include <hamsandwich>
#include <celltravtrie>
#include <sockets>
/*
| Handle replacement type cvar
|
| 1: complete replacement turned on
| 2: dynamic replacement turned on
| 3: both replacement turned on
*/
new CvarReplacementType
new ReplacementType
enum _:StringData
{
OldString[128],
NewString[128]
}
enum _:WeaponsData
{
WeaponIdentifier[100],
vModel[128],
pModel[128],
wModel[128]
}
enum _:ModelsData
{
ModelName[128],
ModelIndex
}
enum
{
WeaponsModelSection = 1,
PlayersModelSection,
SoundsSection
}
enum
{
DestroyArray = 1,
DestroyTrie
}
enum _:FakemetaHooks
{
SetClientKeyValue,
ClientUserInfoChanged,
SetModel,
EmitSound,
EmitAmbientSound
}
new HandlePfnHooks[FakemetaHooks]
new Array:ArrayStrings
new Trie:TrieWeaponModels
new Trie:TrieSounds
new Trie:TrieMemoryAddresses
new TravTrie:TriePlayerModels
new LibraryBaseAddress
new StringsArraySize
new CheckFileStatus
new MaxPlayers
new MessageClCorpse
new ClCorpseRegisterIndex
new SocketResourcesReplacement
new CvarAdminFlagsReadType
new OrpheuHook:CBasePlayerWeapon_DefaulDeploy
new GlobalFilePath[150]
new MapFilePath[150]
new ConfigsDirPath[80]
new MapName[32]
/*
MAIN FUNCTIONS
plugin_precache
InitializeCompleteReplacement()
InitializeDynamicReplacement()
InitializeVersionChecker()
ReadConfigurationFile()
InitializeCompleteReplacement
InitializeDynamicReplacement
RegisterForwards()
InitializeVersionChecker
WaitForResponse()
ReadConfigurationFile
GetDataFromFirstFile()
CheckResources()
GetFilePointer()
GetDataFromSecondFile()
plugin_natives
FindReplaceType()
FindReplacedString()
plugin_pause
UnregisterForwards()
UnpatchMemory()
plugin_unpause
RegisterForwards()
PatchMemory()
plugin_end
UnpatchMemory()
UnregisterForwards()
Destroy()
*/
/*
WEAPON MODELS HOOKS
OnDefaultDeploy
ProcessFullKey()
CheckCondition()
PfnSetModel
*/
if(!equal(TrieWeaponData[wModel], NullItem))
{
engfunc(EngFunc_SetModel, Ent, TrieWeaponData[wModel])
}
}
}
}
/*
PLAYER MODELS HOOKS
PfnSetClientKeyValue
GetCorrectKey()
ProcessFullKey
CheckCondition()
PfnClientUserInfoChanged()
GetCorrectKey
ProcessFullKey
CheckCondition()
OnClCorpse_Message
GetCorrectKey()
ProcessFullKey
CheckCondition()
*/
if(TrieKey[0] != EOS)
{
new TrieModelData[ModelsData]
TravTrieGetArray(TriePlayerModels, TrieKey, TrieModelData, sizeof
TrieModelData)
if(!equal(Value, TrieModelData[ModelName]))
{
set_user_info(id, ModelKey, TrieModelData[ModelName])
set_pdata_int(id, m_iModelIndex, TrieModelData[ModelIndex],
XoPlayer)
}
return FMRES_SUPERCEDE
}
}
return FMRES_IGNORED
}
public PfnClientUserInfoChanged(id)
{
if(!is_user_alive(id))
{
return FMRES_IGNORED
}
if(TrieKey[0] != EOS)
{
new TrieModelData[ModelsData]
TravTrieGetArray(TriePlayerModels, TrieKey, TrieModelData, sizeof
TrieModelData)
if(!equal(CurrentModel, TrieModelData[ModelName]))
{
set_user_info(id, ModelKey, TrieModelData[ModelName])
set_pdata_int(id, m_iModelIndex, TrieModelData[ModelIndex],
XoPlayer)
}
return FMRES_SUPERCEDE
}
return FMRES_IGNORED
}
public OnClCorpse_Message()
{
new id = get_msg_arg_int(12)
if(!is_user_connected(id))
{
return
}
if(TrieKey[0] != EOS)
{
new TrieModelData[ModelsData]
TravTrieGetArray(TriePlayerModels, TrieKey, TrieModelData, sizeof
TrieModelData)
set_msg_arg_string(1, TrieModelData[ModelName])
}
}
while(MoreTravTrie(TrieIter))
{
ReadTravTrieKey(TrieIter, Key, charsmax(Key))
if(equal(Key, OldModel))
{
copy(FullKey, KeySize, Key)
break
}
else
{
copy(BackUpKey, charsmax(BackUpKey), Key)
if(contain(Key, "+") != -1)
{
if(ProcessFullKey(id, Key, charsmax(Key)))
{
copy(FullKey, KeySize, BackUpKey)
break
}
}
else
{
if(CheckCondition(id, Key, charsmax(Key)))
{
copy(FullKey, KeySize, BackUpKey)
break
}
}
}
ReadTravTrieArray(TrieIter, Data, sizeof Data) //Hack, only to
increment the iterator
}
DestroyTravTrieIterator(TrieIter)
}
if(ValidConditions == TotalConditions)
{
return true
}
return false
}
bool:CheckCondition(id, Condition[], ConditionSize)
{
switch(Condition[0])
{
case 'S':
{
if(1 <= id <= MaxPlayers)
{
new PlayerAuthId[35]; get_user_authid(id, PlayerAuthId,
charsmax(PlayerAuthId))
if(equal(PlayerAuthId, Condition))
{
return true
}
}
}
case 'F':
{
if(contain(Condition, "Flag_") != -1)
{
replace(Condition, ConditionSize, "Flag_", "")
switch(get_pcvar_num(CvarAdminFlagsReadType))
{
case 0:
{
if(get_user_flags(id) & read_flags(Condition))
{
return true
}
}
case 1:
{
if(get_user_flags(id) == read_flags(Condition))
{
return true
}
}
}
}
}
case 'T':
{
new UserTeam = get_user_team(id)
switch(Condition[5])
{
case 'T':
{
if(UserTeam == 1)
{
return true
}
}
case 'C':
{
if(UserTeam == 2)
{
return true
}
}
}
}
case 'A':
{
return true
}
}
return false
}
/*
SOUND HOOKS
PfnEmitSound
PfnEmitAmbientSound
*/