Пробовал и в Мод и в сам плагин "пихать" - не заработало.
Суть простая:
При выборе Расы Человека - модель игрока из любым оружием становиться невидимой
Но как только оружие появляеться за спиной - оно приобретает полностью видимый вид.
- Код: Выделить всё
===================================================================================
If this were in FakeMeta I could tell you.
But I don't know what the constant for alpha is in Engine.
Ask how to change/get Alpha in Engine in scripting help.
Then replace:
Code:
set_entity_visibility(g_bwEnt[id], 1)
entity_set_model(g_bwEnt[id], modelName)
(Near the end of Event_CurWeapon)
With:
Code:
set_entity_visibility(g_bwEnt[id], 1)
entity_set_model(g_bwEnt[id], modelName)
entity_set_int(g_bwEnt[id],EV_INT_Alpha,entity_get_int(entity_set_int(id,EV_INT_Alpha))
===================================================================================
#include < amxmodx >
#include < engine >
#include < fakemeta >
#pragma semicolon 1
#define PLUGIN "Attachments Visibility"
#define VERSION "0.0.1"
new g_iMaxPlayers;
#define IsPlayer(%0) ( 1 <= (%0) <= g_iMaxPlayers )
public plugin_init()
{
register_plugin( PLUGIN, VERSION, "ConnorMcLeod" );
register_forward(FM_AddToFullPack, "OnAddToFullPack_Post", true);
g_iMaxPlayers = get_maxplayers();
}
public OnAddToFullPack_Post(es, e, ent, host, hostflags, player, pSet)
{
if( !player && get_orig_retval() && get_es(es, ES_MoveType) == MOVETYPE_FOLLOW )
{
static aiment, Float:rendercolor[3], RenderColor[3];
aiment = entity_get_edict(ent, EV_ENT_aiment);
if( IsPlayer(aiment) && aiment != host )
{
set_es(es, ES_RenderMode, entity_get_int(aiment, EV_INT_rendermode));
set_es(es, ES_RenderAmt, clamp( floatround(entity_get_float(aiment, EV_FL_renderamt)), 0, 255 ));
entity_get_vector(aiment, EV_VEC_rendercolor, rendercolor);
FVecIVec(rendercolor, RenderColor);
set_es(es, ES_RenderColor, RenderColor);
set_es(es, ES_RenderFx, entity_get_int(aiment, EV_INT_renderfx));
}
}
}
=================================================================================
set_user_rendering( id, kRenderFxNone, 0, 0, 0, kRenderTransTexture, invlevel );
=================================================================================
- Код: Выделить всё
/*ԯ`ظ.ԯ`ظ.ԯ`ظ.ԯ`ظ.ԯ`ظ.ԯ`ظ.ԯ`ظ.ԯ`ظ.ԯ`ظ.ԯ`ظ.ԯ`ظ.
* Race: Human Alliance Functions
ԯ`ظ.ԯ`ظ.ԯ`ظ.ԯ`ظ.ԯ`ظ.ԯ`ظ.ԯ`ظ.ԯ`ظ.ԯ`ظ.ԯ`ظ.ԯ`ظ.*/
#include <colorchat>
#define BLINK_COOLDOWN 2.0
#define BASH_GLOW_INTENSITY 200
#define BASH_HOLD_TIME 0.7
HU_ULT_Blink( id )
{
// User can't Blink when he/she's stunned
if ( p_data_b[id][PB_STUNNED] )
{
WC3_StatusText( id, 0, "%L", id, "CLIENT_PRINT_HU_ULT_BLINK_1" );
return;
}
new vOldLocation[3], vNewLocation[3]
// Get the player's current location
get_user_origin( id, vOldLocation );
// Get where the player is looking (where the player will teleport)
get_user_origin( id, vNewLocation, 3 );
// Play the blink sound!
emit_sound( id, CHAN_STATIC, g_szSounds[SOUND_BLINK], 1.0, ATTN_NORM, 0, PITCH_NORM );
// Make sure a nearby enemy doesn't have immunity
if ( WC3_IsImmunePlayerNear( id, vOldLocation ) || WC3_IsImmunePlayerNear( id, vNewLocation ) )
{
//set_hudmessage( 255, 255, 10, -1.0, -0.4, 1, 0.5, BLINK_COOLDOWN, 0.2, 0.2 ,-1 );
WC3_StatusText( id, 0, "%L", id, "TELEPORT_FAILED_ENEMY_IMMUNITY" );
// Reset the user's ultimate
ULT_ResetCooldown( id, get_pcvar_num( CVAR_wc3_ult_cooldown ) );
return;
}
// Check to see if the user is teleporting where they shouldn't
if ( SHARED_NearObjective( vNewLocation ) == OBJENT_VIP_ESCAPE )
{
WC3_StatusText( id, 0, "%L", id, "CLIENT_PRINT_HU_ULT_BLINK_2" );
// Reset the user's ultimate
ULT_ResetCooldown( id, get_pcvar_num( CVAR_wc3_ult_cooldown ) );
return;
}
// If we teleport them back, make sure they don't get teleported into the ground
vOldLocation[ZPOS] += 15;
// Change coordinates to make sure player won't get stuck in the ground/wall
vNewLocation[XPOS] += ( ( vNewLocation[XPOS] - vOldLocation[XPOS] > 0 ) ? -50 : 50 );
vNewLocation[YPOS] += ( ( vNewLocation[YPOS] - vOldLocation[YPOS] > 0 ) ? -50 : 50 );
vNewLocation[ZPOS] += 40;
// Set up some origins for some special effects!!!
new vCenterOrigin[3], vAxisOrigin[3];
vCenterOrigin[0] = vOldLocation[0];
vCenterOrigin[1] = vOldLocation[1];
vCenterOrigin[2] = vOldLocation[2] + 10;
vAxisOrigin[0] = vOldLocation[0];
vAxisOrigin[1] = vOldLocation[1];
vAxisOrigin[2] = vOldLocation[2] + 10 + TELEPORT_RADIUS;
// Lets create some beam cylinders!
Create_TE_BEAMCYLINDER( vOldLocation, vCenterOrigin, vAxisOrigin, g_iSprites[SPR_SHOCKWAVE], 0, 0, 3, 60, 0, 0, 255, 0, 255, 0 );
// Modify our effects a bit for another cylinder
vCenterOrigin[2] += 80;
vAxisOrigin[2] += 80;
// And draw another cylinder!!!
Create_TE_BEAMCYLINDER( vOldLocation, vCenterOrigin, vAxisOrigin, g_iSprites[SPR_SHOCKWAVE], 0, 0, 3, 60, 0, 0, 255, 0, 255, 0 );
// Planting the bomb then teleporting = bad, lets stop this...
client_cmd( id, "-use" );
// Then lets try to slay some bitches...
if ( get_pcvar_num( CVAR_wc3_blink_protection ) )
{
// Lets go ahead and make this check before they teleport...
if ( HU_ULT_BlinkProtection( id, vNewLocation ) )
{
ULT_ResetCooldown( id, get_pcvar_num( CVAR_wc3_ult_cooldown ) );
return;
}
}
// Teleport the player!!!
set_user_origin( id, vNewLocation );
// Check if Blink landed you in a wall, if so, abort
new parm[5];
parm[0] = id;
parm[1] = vOldLocation[0];
parm[2] = vOldLocation[1];
parm[3] = vOldLocation[2];
parm[4] = vNewLocation[2];
set_task( 0.1, "_HU_ULT_BlinkStuck", TASK_BLINKSTUCK + id, parm, 5 );
ULT_ResetCooldown( id, get_pcvar_num( CVAR_wc3_ult_cooldown ) );
ULT_Icon( id, ICON_HIDE );
emit_sound( id, CHAN_STATIC, g_szSounds[SOUND_BLINK], 1.0, ATTN_NORM, 0, PITCH_NORM );
return;
}
// Function will check to see if a user is stuck in a wall
public _HU_ULT_BlinkStuck( parm[] )
{
new id = parm[0]
if ( !p_data_b[id][PB_ISCONNECTED] )
{
return;
}
new vOldLocation[3], vOrigin[3];
vOldLocation[0] = parm[1];
vOldLocation[1] = parm[2];
vOldLocation[2] = parm[3];
get_user_origin( id, vOrigin );
// Then the user is stuck :/
if ( parm[4] == vOrigin[2] )
{
//set_hudmessage( 255, 255, 10, -1.0, -0.4, 1, 0.5, BLINK_COOLDOWN, 0.2, 0.2, 5 );
WC3_StatusText( id, 0, "%L", id, "TELEPORT_FAILED_BAD_DESTINATION" );
set_user_origin( id, vOldLocation ) ;
ULT_ResetCooldown( id, floatround(BLINK_COOLDOWN) );
}
// Otherwise they teleported correctly!
else
{
// Sprays white bubbles everywhere
new vStartOrigin[3];
vStartOrigin[0] = vOrigin[0];
vStartOrigin[1] = vOrigin[1];
vStartOrigin[2] = vOrigin[2] + 40;
Create_TE_SPRITETRAIL( vStartOrigin, vOrigin, g_iSprites[SPR_FLARE], 30, 10, 1, 50, 10 );
}
return;
}
// Function will make sure the user isn't in an invalid location in a map
HU_ULT_BlinkProtection( id, vOrigin[3] )
{
new bool:bSlay = false;
new Float:fOrigin[3];
// Convert origin to float
IVecFVec( vOrigin, fOrigin );
// User shouldn't be teleporting into the sky!
if ( point_contents( fOrigin ) == CONTENTS_SKY )
{
bSlay = true;
}
// Get the current map name
new szMapName[32];
get_mapname( szMapName, 32 );
// Only do these checks if we're in CS/CZ
if ( g_MOD == GAME_CSTRIKE || g_MOD == GAME_CZERO )
{
if ( !bSlay )
{
new x = vOrigin[0];
new y = vOrigin[1];
new z = vOrigin[2];
// Don't teleport too high
if ( equali( szMapName, "de_dust" ) )
{
if ( z > 220 )
{
bSlay = true;
}
}
else if ( equali( szMapName, "awp_assault" ) )
{
if( z > 520 && y > 2400 && y < 2600 )
{
bSlay = true;
}
}
else if ( equali( szMapName, "de_dust_cz" ) )
{
if ( z > 220 )
{
bSlay = true;
}
}
else if ( equali( szMapName, "de_aztec_cz" ) )
{
if ( z > 300 )
{
bSlay = true;
}
}
else if ( equali( szMapName, "cs_assault_upc" ) )
{
if( z > 650 )
{
bSlay = true;
}
}
else if ( equali( szMapName, "de_aztec" ) )
{
if( z > 300 )
{
bSlay = true;
}
}
else if ( equali( szMapName, "de_cbble" ) || equali( szMapName, "de_cbble_cz" ) )
{
if ( z > 315 )
{
if ( ! ( ( x > -1320 && x < -1150 ) && ( y > 2600 && y < 2900 ) ) )
{
bSlay = true;
}
}
}
else if ( equali( szMapName, "cs_assault" ) )
{
if ( z > 700 )
{
bSlay = true;
}
}
else if ( equali( szMapName, "cs_militia" ) || equali( szMapName, "cs_militia_cz" ) )
{
if ( z > 500 )
{
bSlay = true;
}
}
else if ( equali( szMapName, "cs_italy" ) )
{
if ( z > -220 && y < -2128 )
{
bSlay = true;
}
else if( z > 250 )
{
if ( ( x < -1000 && x > -1648 ) && ( y > 1900 && y < 2050 ) )
{
bSlay = true;
}
else if ( ( x < -1552 && x > -1648 ) && ( y > 1520 && y < 2050 ) )
{
bSlay = true;
}
}
}
else if ( equali( szMapName, "cs_italy_cz" ) )
{
if ( y > 2608 )
{
bSlay = true;
}
}
else if ( equali( szMapName, "de_dust2" ) )
{
if ( z > 270 )
{
bSlay = true;
}
}
else if ( equali( szMapName, "de_dust2_cz" ) )
{
if ( z > 270 )
{
bSlay = true;
}
}
else if ( equali( szMapName, "fy_dustworld" ) )
{
if ( z > 82 )
{
bSlay = true;
}
}
else if ( equali( szMapName, "fy_pool_day" ) )
{
if ( z > 190 )
{
bSlay = true;
}
}
else if ( equali( szMapName, "as_oilrig" ) )
{
if ( x > 1700 )
{
bSlay = true;
}
}
}
}
// For some reason bSlay is always true on this map, but you should be able to teleport anywhere
if ( equali( szMapName, "cs_mice_final" ) )
{
bSlay = false;
}
// Slay the user!!!
if ( bSlay )
{
#if AMXX_VERSION_NUM < 183
ColorChat(id, RED, "%L", LANG_PLAYER, "SLAIN_FOR_TELEPORTING" );
#else
client_print_color(id, print_team_red, "%L", LANG_PLAYER, "SLAIN_FOR_TELEPORTING" );
#endif
//client_print( id, print_chat, "%s %L", id, "SLAIN_FOR_TELEPORTING" );
user_kill( id );
}
return bSlay;
}
HU_DevotionAura( id )
{
if ( !is_user_alive( id ) )
{
return;
}
static iSkillLevel;
iSkillLevel = SM_GetSkillLevel( id, SKILL_DEVOTION );
// Then the user has devotion aura + hasn't lost some skill levels!
if ( iSkillLevel > 0 )
{
// Increase the user's health
set_user_health( id, get_user_health( id ) + ( p_devotion * iSkillLevel ) );
}
}
HU_SkillsOffensive( iAttacker, iVictim )
{
static iSkillLevel;
// Bash
iSkillLevel = SM_GetSkillLevel( iAttacker, SKILL_BASH );
if ( iSkillLevel > 0 )
{
// Cannot bash if already bashed or user is slowed
if ( random_float( 0.0, 1.0 ) <= p_bash[iSkillLevel-1] && !SHARED_IsPlayerSlowed( iVictim ) )
{
p_data_b[iVictim][PB_STUNNED] = true;
SHARED_SetSpeed( iVictim );
set_task( BASH_HOLD_TIME, "SHARED_ResetMaxSpeed", TASK_RESETSPEED + iVictim );
// Make the user glow!
SHARED_Glow( iVictim, 0, 0, 0, BASH_GLOW_INTENSITY );
// Create a screen fade
Create_ScreenFade( iVictim, (1<<10), (1<<10), (1<<12), 255, 255, 255, g_GlowLevel[iVictim][3] )
}
}
}
- Код: Выделить всё
public SHARED_INVIS_Set( id )
{
// Do not want to set them as invisible if the player is currently rendering
if ( !p_data_b[id][PB_CAN_RENDER] || !p_data_b[id][PB_ISCONNECTED] )
{
return;
}
new iInvisLevel = 0;
static iSkillLevel;
iSkillLevel = SM_GetSkillLevel( id, SKILL_INVISIBILITY );
// If they are Human Alliance with Invisibility lets set the level
if ( iSkillLevel > 0 )
{
iInvisLevel = p_invisibility[iSkillLevel-1];
}
// User has a Cloak of Invisibility
if ( ITEM_Has( id, ITEM_CLOAK ) > ITEM_NONE )
{
// Then we are already a little invis, lets give them a little bonus for purchasing the item
if ( iInvisLevel > 0 )
{
iInvisLevel = floatround( float( iInvisLevel ) / INVIS_CLOAK_DIVISOR );
}
else
{
iInvisLevel = get_pcvar_num( CVAR_wc3_cloak );
}
}
// If the player is holding a knife they should be more invisible
if ( SHARED_IsHoldingKnife( id ) )
{
iInvisLevel /= 2;
}
if ( iInvisLevel )
{
set_user_rendering( id, kRenderFxNone, 0, 0, 0, kRenderTransTexture, iInvisLevel );
p_data_b[id][PB_INVIS] = true;
}
// User should not be invisible
else
{
set_user_rendering( id );
p_data_b[id][PB_INVIS] = false;
}
return;
}
// Function will return true if their active weapon is a knife
public SHARED_IsHoldingKnife( id )
{
new iClip, iAmmo, iWeapon;
iWeapon = get_user_weapon( id, iClip, iAmmo );
// Check for Counter-Strike or Condition Zero
if ( g_MOD == GAME_CSTRIKE || g_MOD == GAME_CZERO )
{
if ( iWeapon == CSW_KNIFE )
{
return true;
}
}
// Check for Day of Defeat
else if ( g_MOD == GAME_DOD )
{
if ( iWeapon == DODW_AMERKNIFE || iWeapon == DODW_GERKNIFE || iWeapon == DODW_SPADE )
{
return true;
}
}
return false;
}
- Код: Выделить всё
#include <amxmodx>
#include <fakemeta>
#include <hamsandwich>
#define MAX_PLAYERS 32
#define OFFSET_PRIMARYWEAPON 116
#define OFFSET_WEAPONTYPE 43
#define EXTRAOFFSET_WEAPONS 4
#define OFFSET_AUTOSWITCH 509
#define OFFSET_SHIELD 510
#define HAS_SHIELD (1<<24)
#define PRIMARY_WEAPONS (1<<CSW_SCOUT | 1<<CSW_XM1014 | 1<<CSW_MAC10 | 1<<CSW_AUG | 1<<CSW_UMP45 | 1<<CSW_SG550 | 1<<CSW_GALIL | 1<<CSW_FAMAS | 1<<CSW_AWP | 1<<CSW_MP5NAVY | 1<<CSW_M249 | 1<<CSW_M3 | 1<<CSW_M4A1 | 1<<CSW_TMP | 1<<CSW_G3SG1 | 1<<CSW_SG552 | 1<<CSW_AK47 | 1<<CSW_P90)
#define is_weapon_primary(%1) (PRIMARY_WEAPONS & (1<<%1))
#define cs_get_weapon_type(%1) get_pdata_int(%1, OFFSET_WEAPONTYPE, EXTRAOFFSET_WEAPONS)
#define cs_get_user_hasprim(%1) get_pdata_int(%1, OFFSET_PRIMARYWEAPON)
#define cs_get_user_autoswitch(%1) get_pdata_int(%1, OFFSET_AUTOSWITCH)
#define cs_get_user_shield(%1) (get_pdata_int(%1, OFFSET_SHIELD) & HAS_SHIELD) ? 1 : 0
enum
{
MODEL_NULL = 0,
MODEL_AUG = 1,
MODEL_AK47 = 2,
MODEL_AWP = 3,
MODEL_MP5NAVY = 4,
MODEL_P90 = 5,
MODEL_GALIL = 6,
MODEL_M4A1 = 7,
MODEL_SG550 = 8,
MODEL_SG552 = 9,
MODEL_SCOUT = 10,
MODEL_XM1014 = 11,
MODEL_G3SG1 = 13,
MODEL_M249 = 14,
MODEL_FAMAS = 15,
MODEL_UMP45 = 16,
MODEL_TMP = 17,
MODEL_MAC10 = 18
}
new g_weapons[][] =
{
"weapon_p228",
"weapon_scout",
"weapon_hegrenade",
"weapon_xm1014",
"weapon_c4",
"weapon_mac10",
"weapon_aug",
"weapon_smokegrenade",
"weapon_elite",
"weapon_fiveseven",
"weapon_ump45",
"weapon_sg550",
"weapon_galil",
"weapon_famas",
"weapon_usp",
"weapon_glock18",
"weapon_awp",
"weapon_mp5navy",
"weapon_m249",
"weapon_m3",
"weapon_m4a1",
"weapon_tmp",
"weapon_g3sg1",
"weapon_flashbang",
"weapon_deagle",
"weapon_sg552",
"weapon_ak47",
"weapon_knife",
"weapon_p90"
}
new g_weaponclass[] = "backweapon"
new g_weaponmodel[] = "models/backweapons_wc/backweapons_wc.mdl"
new g_weaponent[MAX_PLAYERS+1]
new bot_limit,bool:bot_ham
public plugin_init()
{
register_plugin("Back Weapons", "1.87", "hoboman313; cheap_suit")
RegisterHam(Ham_Killed, "player", "bacon_killed")
RegisterHam(Ham_Spawn, "player", "bacon_spawn_post", 1)
RegisterHam(Ham_AddPlayerItem, "player", "bacon_addplayeritem")
RegisterHam(Ham_RemovePlayerItem, "player", "bacon_removeplayeritem")
bot_limit=get_cvar_pointer("bot_quota")
for(new i = 0; i < sizeof g_weapons; i++)
{
RegisterHam(Ham_Item_AttachToPlayer, g_weapons[i], "bacon_item_attachtoplayer_post", 1)
RegisterHam(Ham_Item_Deploy, g_weapons[i], "bacon_item_deploy_post", 1)
}
}
public plugin_precache()
precache_model(g_weaponmodel)
public client_putinserver(id)
{
static infotarget
if(!infotarget) infotarget = engfunc(EngFunc_AllocString, "info_target")
g_weaponent[id] = engfunc(EngFunc_CreateNamedEntity, infotarget)
if(pev_valid(g_weaponent[id]))
{
engfunc(EngFunc_SetModel, g_weaponent[id], g_weaponmodel)
set_pev(g_weaponent[id], pev_classname, g_weaponclass)
set_pev(g_weaponent[id], pev_movetype, MOVETYPE_FOLLOW)
set_pev(g_weaponent[id], pev_effects, EF_NODRAW)
set_pev(g_weaponent[id], pev_aiment, id)
}
if(is_user_bot(id)&&!bot_ham&&bot_limit)set_task(0.1,"reg_ham_bot",id)
}
public client_disconnect(id)
{
if(g_weaponent[id] > 0 && pev_valid(g_weaponent[id]))
engfunc(EngFunc_RemoveEntity, g_weaponent[id])
g_weaponent[id] = 0
}
public reg_ham_bot(id)
{
if(bot_ham||!is_user_connected(id)||!get_pcvar_num(bot_limit))return
RegisterHamFromEntity(Ham_Killed,id,"bacon_killed")
RegisterHamFromEntity(Ham_Spawn,id,"bacon_spawn_post",1)
RegisterHamFromEntity(Ham_AddPlayerItem,id,"bacon_addplayeritem")
RegisterHamFromEntity(Ham_RemovePlayerItem,id,"bacon_removeplayeritem")
bot_ham=true;if(is_user_alive(id))bacon_spawn_post(id)
}
public bacon_killed(id, idattacker, shouldgib)
fm_set_entity_visibility(g_weaponent[id], 0)
public bacon_addplayeritem(id, ent)
{
static weaponid; weaponid = cs_get_weapon_type(ent)
if(is_weapon_primary(weaponid) && pev_valid(g_weaponent[id]))
{
fm_set_entity_visibility(g_weaponent[id], 0)
set_pev(g_weaponent[id], pev_body, get_weapon_model(weaponid))
}
}
public bacon_removeplayeritem(id, ent)
{
if(is_weapon_primary(cs_get_weapon_type(ent)) && pev_valid(g_weaponent[id]))
fm_set_entity_visibility(g_weaponent[id], 0)
}
public bacon_spawn_post(id) if(is_user_alive(id))
{
if(!cs_get_user_hasprim(id))
fm_set_entity_visibility(g_weaponent[id], 0)
}
public bacon_item_attachtoplayer_post(ent, id) if(is_user_alive(id) && !cs_get_user_autoswitch(id))
{
if(is_weapon_primary(cs_get_weapon_type(ent)) && pev_valid(g_weaponent[id]))
fm_set_entity_visibility(g_weaponent[id], 1)
}
public bacon_item_deploy_post(ent)
{
static id; id = pev(ent, pev_owner)
if(is_user_alive(id))
{
static weapon; weapon = cs_get_weapon_type(ent)
if(is_weapon_primary(weapon) || cs_get_user_shield(id))
fm_set_entity_visibility(g_weaponent[id], 0)
else if(cs_get_user_hasprim(id))
fm_set_entity_visibility(g_weaponent[id], 1)
}
}
stock get_weapon_model(weapon)
{
switch(weapon)
{
case CSW_SCOUT: return MODEL_SCOUT
case CSW_XM1014: return MODEL_XM1014
case CSW_AUG: return MODEL_AUG
case CSW_UMP45: return MODEL_UMP45
case CSW_SG550: return MODEL_SG550
case CSW_GALIL: return MODEL_GALIL
case CSW_FAMAS: return MODEL_FAMAS
case CSW_AWP: return MODEL_AWP
case CSW_MP5NAVY: return MODEL_MP5NAVY
case CSW_M249: return MODEL_M249
case CSW_M4A1: return MODEL_M4A1
case CSW_G3SG1: return MODEL_G3SG1
case CSW_SG552: return MODEL_SG552
case CSW_AK47: return MODEL_AK47
case CSW_P90: return MODEL_P90
case CSW_MAC10: return MODEL_MAC10
case CSW_TMP: return MODEL_TMP
}
return 0
}
stock fm_set_entity_visibility(index, visible = 1)
set_pev(index, pev_effects, visible == 1 ? pev(index, pev_effects) & ~EF_NODRAW : pev(index, pev_effects) | EF_NODRAW)