Quote:
Originally Posted by Hawk552
Before we begin, I'd just like to state that this tutorial is intended for intermediate to expert level scripters.
You should be able to read all the code I've put here and almost immediately understand what should happen.
|
This tutorial is for an engine-to-fakemeta conversion for the functions set_speak() and get_speak().
First, we'll start off by defining the variables.
Code:
#include <amxmodx>
#include <fakemeta>
#define SPEAK_MUTED 0
#define SPEAK_NORMAL 1
#define SPEAK_ALL 2
#define SPEAK_LISTENALL 4
#define SPEAK_TEAM 8
Now, "What is 'SPEAK_TEAM' ?"
SPEAK_TEAM is a new one that I have thought up myself.
It acts as if alltalk is on, but only for that team.
Example:
I'm dead, and I can still talk to my alive teammates, but not to the other team.
Now, we will need to create a variable so each player can have his/her own flag.
And, we will need to reset the player's flag to SPEAK_NORMAL when he/she enters.
Code:
new g_iSpeakFlags[33];
public client_connect(id)
{
g_iSpeakFlags[id] = SPEAK_NORMAL;
}
We will need some functions to get and set the player's speak mode.
Code:
#define fm_get_speak(%1) g_iSpeakFlags[%1]
#define fm_set_speak(%1, %2) g_iSpeakFlags[%1] = %2
fm_get_speak(index) - returns a player's speak mode
fm_set_speak(index, iSpeakFlag) - sets a player's speak mode
To hook when a player talks, we will need to register the forward FM_Voice_SetClientListening.
Code:
public plugin_init()
{
register_forward(FM_Voice_SetClientListening, "fwd_FM_Voice_SetClientListening");
}
Information about the forward:
Quote:
FM_Voice_SetClientListening, // bool ) (iReceiver, iSender, bool:bListen)
|
Now, we will create our hooked function:
Code:
public fwd_FM_Voice_SetClientListening(receiver, sender, bool:bListen)
{
}
This function is called even when a player isn't talking, so we must filter it out to check if the voice is valid:
Code:
public fwd_FM_Voice_SetClientListening(receiver, sender, bool:bListen)
{
if(!is_user_connected(sender) || !is_user_connected(receiver))
{
return FMRES_IGNORED;
}
}
Also, we will need to check if the voice is a default server voice, and the two players don't have any special voice flags.
Code:
public fwd_FM_Voice_SetClientListening(receiver, sender, bool:bListen)
{
if(!is_user_connected(sender) || !is_user_connected(receiver))
{
return FMRES_IGNORED;
}
// the speaker has no special speech
// and the receiver isn't listening to everyone, so this is a default voice
if(g_iSpeakFlags[sender] == SPEAK_NORMAL && g_iSpeakFlags[receiver] != SPEAK_LISTENALL)
{
return FMRES_IGNORED;
}
}
Now it's time to set the listening.
Code:
public fwd_FM_Voice_SetClientListening(receiver, sender, bool:bListen)
{
if(!is_user_connected(sender) || !is_user_connected(receiver))
{
return FMRES_IGNORED;
}
// the speaker has no special speech
// and the receiver isn't listening to everyone, so this is a default voice
if(g_iSpeakFlags[sender] == SPEAK_NORMAL && g_iSpeakFlags[receiver] != SPEAK_LISTENALL)
{
return FMRES_IGNORED;
}
new iSpeakValue = 0;
// this will be the value to determine if the voice should be sent
// (1 for true, 0 for false)
// Check if the voice SHOULD be sent
if(g_iSpeakFlags[sender] == SPEAK_ALL
// speaker can talk to everyone
// or
|| g_iSpeakFlags[receiver] == SPEAK_LISTENALL
// receiver can hear anyone
// or
|| g_iSpeakFlags[sender] == SPEAK_TEAM && get_pdata_int(sender, 114) == get_pdata_int(receiver, 114))
// speaker can only talk to team.
// get_pdata_int(index, 114) is the fakemeta version of cs_get_user_team(index)
{
iSpeakValue = 1;
}
// set the voice
engfunc(EngFunc_SetClientListening, receiver, sender, iSpeakValue);
return FMRES_SUPERCEDE;
}
When you are finished, this should be your full code (without comments):
Code:
#include <amxmodx>
#include <fakemeta>
#define SPEAK_MUTED 0
#define SPEAK_NORMAL 1
#define SPEAK_ALL 2
#define SPEAK_LISTENALL 4
#define SPEAK_TEAM 8
new g_iSpeakFlags[33];
#define fm_get_speak(%1) g_iSpeakFlags[%1]
#define fm_set_speak(%1, %2) g_iSpeakFlags[%1] = %2
public plugin_init()
{
register_forward(FM_Voice_SetClientListening, "fwd_FM_Voice_SetClientListening");
}
public client_connect(id)
{
g_iSpeakFlags[id] = SPEAK_NORMAL;
}
public fwd_FM_Voice_SetClientListening(receiver, sender, bool:bListen)
{
if(!is_user_connected(receiver) || !is_user_connected(sender))
{
return FMRES_IGNORED;
}
if(g_iSpeakFlags[sender] == SPEAK_NORMAL && g_iSpeakFlags[receiver] != SPEAK_LISTENALL)
{
return FMRES_IGNORED;
}
new iSpeakValue = 0;
if(g_iSpeakFlags[sender] == SPEAK_ALL
|| g_iSpeakFlags[receiver] == SPEAK_LISTENALL
|| g_iSpeakFlags[sender] == SPEAK_TEAM && get_pdata_int(sender, 114) == get_pdata_int(receiver, 114))
{
iSpeakValue = 1;
}
engfunc(EngFunc_SetClientListening, receiver, sender, iSpeakValue);
return FMRES_SUPERCEDE;
}
Any mistakes or suggestions, speak up!
__________________