Half-Life Icon HL Script

[AMXX] [ALL] Anti DoubleDuck

Hello world. We are one of the oldest mod sites on the Interwebs. Sign up and maximize your browsing experience.

  • Subscribe: Get notified of new submissions like this.
  • Say Thanks: Show your appreciation by sending Rj. points.
  • Post: Give Rj. your thoughts on this Script.
  • Vote: Help Rj. win the Monthly Awards.
  • Rate: Give this Script a rating out of 10.
  • Flag: Alert moderators and warn members of a problem with this Script.
  • Watch: Get notified when this Script is updated.
Mascot

Sound fun?

Join GameBanana

Already a Bananite? Login

194 lines | 8 kb | Raw Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
/**
 *
 * Anti DoubleDuck (DoubleDuck Blocker)
 *  by Numb
 *
 *
 * Description:
 *  Permanently blocks player ability to doubleduck.
 *
 *
 * Requires:
 *  FakeMeta
 *
 *
 * Additional Info:
 *  + Tested in Counter-Strike 1.6 with amxmodx 1.8.1. But should work with all Half-Life mods and some older amxx versions.
 *
 *
 * Notes:
 *  + I'm begging Valve to not use any ideas of this plugin for future updates of CS/CZ.
 *  + If your game mod is not Counter-Strike / Condition-Zero, you should take a look on plugins config.
 *
 *
 * ChangeLog:
 *
 *  + 1.7
 *  - Changed: Client-side doubleduck block uses almost twice less CPU power.
 *
 *  + 1.6
 *  - Fixed: There was one frame delay during what player was fully ducked while trying to doubleduck.
 *  - Changed: Plugin uses a bit less resources.
 *
 *  + 1.5
 *  - Added: Config in source code to disable client-side doubleduck block (when disabled uses less resources).
 *  - Changed: Plugin uses a bit less resources.
 *
 *  + 1.4
 *  - Fixed: Client-side bug moving up. (Suggesting to use sv_stepsize 17 instead of standard 18, but there aren't much blocks where you are going up more than 16 units.)
 *
 *  + 1.3
 *  - Fixed: If user is lagy and in a run - client-side doubleduck block isn't working properly.
 *  - Fixed: If user just landed and doubleducked client-side doubleduck block isn't working all the time (depends from ping).
 *  - Fixed: Client-side doubleduck block not working properly in random map areas.
 *  - Fixed: If user just unducked and made a doubleduck - client-side doubleduck block isn't working all the time (depends from ping).
 *
 *  + 1.2
 *  - Added: Client-side doubleduck block.
 *
 *  + 1.1
 *  - Changed: Made 1-based array (lower CPU usage).
 *  - Changed: Modified check when user is pre-doubleducking - now uses only 1 variable (lower cpu usage).
 *
 *  + 1.0
 *  - First release.
 *
 *
 * Downloads:
 *  Amx Mod X forums: http://forums.alliedmods.net/showthread.php?p=619219
 *
**/




// ========================================================================= CONFIG START =========================================================================

// Comment this line if you need more CPU or you don't want to block client-side doubleduck.
#define BLOCK_CLIENT_SIDE_DD_VIEW // default: enabled (uncommented)



// If you are using client-side doubleduck block (this is just a start of upcoming configs):
#if defined BLOCK_CLIENT_SIDE_DD_VIEW // this is only a notification (but a needed one) - do not change/remove it.


// Please write any world-view gun model what is automatically downloaded by the engine.
#define ENTITY_MDL "models/w_awp.mdl" // default: ("models/w_awp.mdl") (for use in cs/cz)

// Class-Name of anti-doubleduck entity.
#define ENTITY_NAME "anti_doubleducker" // default: ("anti_doubleducker")


#endif // this is only a notification (but a needed one) - do not change/remove it.

// ========================================================================== CONFIG END ==========================================================================



#include <amxmodx>
#include <fakemeta>

#define PLUGIN_NAME    "Anti DoubleDuck"
#define PLUGIN_VERSION "1.7"
#define PLUGIN_AUTHOR  "Numb"

#if defined BLOCK_CLIENT_SIDE_DD_VIEW
#define ENTITY_NAME "anti_doubleducker"

new g_iFakeEnt;
#endif
new bool:g_bIsUserDead[33];

public plugin_init()
{
        register_plugin(PLUGIN_NAME, PLUGIN_VERSION, PLUGIN_AUTHOR);
       
        register_event("ResetHUD", "Event_ResetHUD", "be");
        register_event("Health",   "Event_Health",   "bd", "1=0");
       
        register_forward(FM_PlayerPreThink, "FM_PlayerPreThink_Pre", 0);
       
#if defined BLOCK_CLIENT_SIDE_DD_VIEW
        if( (g_iFakeEnt=engfunc(EngFunc_CreateNamedEntity, engfunc(EngFunc_AllocString, "info_target")))>0 ) // if anti-doubleduck entity created successfully:
        {
                set_pev(g_iFakeEnt, pev_classname,  ENTITY_NAME);       // lets register entity as non-standard
                set_pev(g_iFakeEnt, pev_solid,      SOLID_NOT);         // why it should be solid to the server engine?
                set_pev(g_iFakeEnt, pev_movetype,   MOVETYPE_NONE);     // lets make it unmovable
                set_pev(g_iFakeEnt, pev_rendermode, kRenderTransAlpha); // we are starting to render it in invisible mode
                set_pev(g_iFakeEnt, pev_renderamt,  0.0);               // setting visibility level to zero (invinsible)
               
                engfunc(EngFunc_SetModel, g_iFakeEnt, ENTITY_MDL); // we are setting model so client-side trace scan cold detect the entity
                engfunc(EngFunc_SetSize, g_iFakeEnt, Float:{-16.0, -16.0, 53.0}, Float:{16.0, 16.0, 54.0}); // plugin will use less power if we wont change entity size at each FM_AddToFullPack
               
                register_forward(FM_AddToFullPack, "FM_AddToFullPack_Pre", 0); // now we enable main and most important part of client-side double-duck block
        }
#endif
}

public client_connect(iPlrId)
        g_bIsUserDead[iPlrId] = true;

public Event_ResetHUD(iPlrId)
        g_bIsUserDead[iPlrId] = false;

public Event_Health(iPlrId)
        g_bIsUserDead[iPlrId] = true;

public FM_PlayerPreThink_Pre(iPlrId)
{
        if( g_bIsUserDead[iPlrId] )
                return FMRES_IGNORED;
               
        if( pev(iPlrId, pev_oldbuttons)&IN_DUCK && !(pev(iPlrId, pev_button)&IN_DUCK) ) // if user unpressed duck key
        {
                static s_iFlags;
                s_iFlags = pev(iPlrId, pev_flags);
                if( !(s_iFlags&FL_DUCKING) && pev(iPlrId, pev_bInDuck) ) // if user wasn't fully ducked and is in ducking process
                {
                        set_pev(iPlrId, pev_bInDuck, false); // set user not in ducking process
                        set_pev(iPlrId, pev_flags, (s_iFlags|FL_DUCKING)); // set user fully fucked
                        engfunc(EngFunc_SetSize, iPlrId, Float:{-16.0, -16.0, -25.0}, Float:{16.0, 16.0, 25.0}); // set user size as fully ducked (won't take one frame delay)
                }
        }
       
        return FMRES_IGNORED;
}

#if defined BLOCK_CLIENT_SIDE_DD_VIEW
public FM_AddToFullPack_Pre(iEsHandle, iE, iEnt, iPlrId, iHostFlags, iPlayer, iPSet)
{
        if( iEnt==g_iFakeEnt )
        {
                if( g_bIsUserDead[iPlrId] )     // we are just blocking the function if user is dead cause why on earth we need it in this case (plus saves a bit of inet speed)
                        return FMRES_SUPERCEDE; // also I would block it if user is on ladder or in water, but it's unneeded CPU usage cause this two cases are rare
               
                static Float:s_fFallSpeed;
                pev(iPlrId, pev_flFallVelocity, s_fFallSpeed);
                if( s_fFallSpeed>=0.0 ) // vertical speed is always 0.0 if user is on ground, so we aren't checking FL_ONGROUND existence. Plus we need a check is user falling down
                {
                        static Float:s_fOrigin[3];
                        pev(iPlrId, pev_origin, s_fOrigin); // lets get player origin
                       
                        if( pev(iPlrId, pev_flags)&FL_DUCKING ) // this part teleports anti-doubleduck entity 17 units above player head
                                s_fOrigin[2] += s_fFallSpeed?2.0:18.0; // or right on players head if he is falling down to avoid instant double-duck after landing
                        else // and yes - if player is ducked we must teleport it a bit higher comparing to player center
                                s_fOrigin[2] -= s_fFallSpeed?16.0:0.0;
                       
                        //set_es(iEsHandle, ES_Origin, s_fOrigin); // don't care asking me why this doesn't work in certain areas - I really dunno. if it did - CPU would be much better...
                        engfunc(EngFunc_SetOrigin, iEnt, s_fOrigin); // cause ES_Origin doesn't work I use this one (the one what takes all of this power)
                       
                        forward_return(FMV_CELL, dllfunc(DLLFunc_AddToFullPack, iEsHandle, iE, iEnt, iPlrId, iHostFlags, iPlayer, iPSet));
                        // cause ES_Origin doesn't work I forward my own function and block original one to
                        // save CPU by not hooking it twice like I did in 1.6 and older versions of plugin
                       
                        set_es(iEsHandle, ES_Solid, SOLID_BBOX); // now we are making anti-doubleduck entity solid to the client engine
                       
                        return FMRES_SUPERCEDE;
                }
                return FMRES_SUPERCEDE; // now we block original AddToFullPack cause or we already forwarded our own one or to save and server
                                        // and client CPU and internet power cause we don't need this entity to be sent to client this frame
        }
       
        return FMRES_IGNORED;
}
#endif
Description:
This is an engine bug fix plugin - removes ability of doubleducking.

Requires:
FakeMeta

Additional info:
Tested in Counter-Strike 1.6 with amxmodx 1.8.1. But should work with all Half-Life mods and some older amxx versions. There were some plugins like this before, but they all were just setting client speed to 0, to remove only silent-run bug. But doubleduck can be used in some more cases, so I decided to create this one, what permanently blocks this bug.

Notes:
If you are using not Counter-Strike mod please change cs awp world view model to your mod world view model. Model isn't visible, but is really needed so client-side engine trace line could detect anti-doubleduck entity. You can change model at source-code line 79.

Warnings:
* Using this plugin may cause problems in non up-to-date half-life dedicated servers. Make sure you have the newest version of hlds what is provided steam (newest versions: windows / linux).
* If client has custom "models/w_awp.mdl" (by default) - player can be not able to move or even crash in result.
If you are trying to get rid of crouch-hopping also known as silent-run or russian-walk, I strongly recommend to use anti silent-run plugin instead!

Change-Log:

1.7
Changed: Client-side doubleduck block uses almost twice less CPU power.

1.6
Fixed: There was one frame delay during what player was fully ducked while trying to doubleduck.
Changed: Plugin uses a bit less resources.

1.5
Added: config in source code to disable client-side doubleduck block (when disabled uses less resources).
Changed: plugin uses a bit less resources.

1.4
Fixed: client-side bug moving up. (Suggesting to use sv_stepsize 17 instead of standard 18, but there are not much blocks where you are going up = 18 units.)

1.3
Fixed: if user is lagy and in a run - client-side doubleduck block isn't working properly.
Fixed: if user just landed and doubleducked client-side doubleduck isn't working all the time (pends from ping).
Fixed: client-side doubleduck block not working properly in random map areas.
Fixed: if user just unducked and made a doubleduck - client-side doubleduck block isn't working all the time (pends from ping).

1.2
Added: client-side doubleduck block.

1.1
Changed: made 1-based array (lower cpu usage).
Changed: modified check when user is pre-doubleducking - now uses only 1 variable (lower cpu usage).

1.0
- First release.

Comments

None found

Share

Shareable Image:
Share banner
HTML embed code:
BB embed code:
Markdown embed code:

More embeddable images

Bookmark and Share

Credits

Original Authors
MPNumB
MPNumB Offline
Member Joined 8 years ago
AMXX Script/Codes

Submitter

Rj. avatar
Rj. IN PLAYGROUND
Homepage
Member Joined 9 months ago
34 medals 4 legendary 8 rare
  • Submitted 15 Tools Medal icon
  • Submitted 50 Gamefiles Medal icon
  • 15+ Entries! GameBanana’s Christmas Giveaway 2016 Medal icon
  • Thanked 500 submitters Medal icon
  • 2nd Place - Game Poetry Contest Medal icon
  • Submitted 5 Tools Medal icon

Rj.
Redistributor
Are you the owner? Request Ownership
Send a Private Message to the submitter

Category

Attributes

Language
Pawn (AMXMODX)

Stats

Posts
0
Views
132
Date Added
29 days ago
Mar 2 2017 @ 1:05am UTC
Date Updated
29 days ago
Mar 2 2017 @ 1:05am UTC