SHOW:
|
|
- or go back to the newest paste.
| 1 | #include a_samp | |
| 2 | #include zcmd | |
| 3 | #include Dini | |
| 4 | ||
| 5 | #define MAX_GATES 20 | |
| 6 | #define GATE_OBJECT 980 | |
| 7 | #define GATE_STATE_CLOSED 0 | |
| 8 | #define GATE_STATE_OPEN 1 | |
| 9 | ||
| 10 | enum fs_gates | |
| 11 | {
| |
| 12 | gCreated, | |
| 13 | Float:gX, | |
| 14 | Float:gY, | |
| 15 | Float:gZ, | |
| 16 | Float:gA, | |
| 17 | gObject, | |
| 18 | gPlacedBy[24], | |
| 19 | gStatus, | |
| 20 | gPassword | |
| 21 | } | |
| 22 | ||
| 23 | new GateInfo[MAX_GATES][fs_gates]; | |
| 24 | ||
| 25 | CMD:placegate( playerid, params[] ) | |
| 26 | {
| |
| 27 | if( isnull( params) ) | |
| 28 | return SendClientMessage( playerid, -1, "Syntax: /placegate [password]" ); | |
| 29 | ||
| 30 | if( !strval( params ) ) | |
| 31 | return SendClientMessage( playerid, -1, "You need to input numbers." ); | |
| 32 | ||
| 33 | if( IsPlayerInAnyVehicle( playerid ) ) | |
| 34 | return SendClientMessage( playerid, -1, "You need to exit your vehicle." ); | |
| 35 | ||
| 36 | - | new szName[24]; |
| 36 | + | |
| 37 | GetPlayerPos( playerid, pPos[0], pPos[1], pPos[2] ); | |
| 38 | GetPlayerFacingAngle( playerid, pPos[3] ); | |
| 39 | CreateGate( playerid, strval( params ), pPos[0], pPos[1], pPos[2], pPos[3] ); | |
| 40 | - | if( !strcmp( szName, GateInfo[i][gPlacedBy], true ) ) |
| 40 | + | |
| 41 | - | return SendClientMessage( playerid, -1, "You already placed a movable gate." ); |
| 41 | + | |
| 42 | return 1; | |
| 43 | - | continue; |
| 43 | + | |
| 44 | ||
| 45 | CMD:gopen( playerid, params[] ) | |
| 46 | {
| |
| 47 | if( isnull( params ) ) | |
| 48 | return SendClientMessage( playerid, -1, "Syntax: /gopen [password]" ); | |
| 49 | ||
| 50 | new szName[24], gate = -1; | |
| 51 | GetPlayerName( playerid, szName, 24 ); | |
| 52 | for( new i = 0; i != MAX_GATES; i++ ) | |
| 53 | if( GateInfo[i][gCreated] == 1 ) | |
| 54 | if( strval( params ) == GateInfo[i][gPassword] ) | |
| 55 | { gate = i; break; }
| |
| 56 | ||
| 57 | if( gate != -1 ) | |
| 58 | {
| |
| 59 | if( !IsObjectMoving( GateInfo[gate][gObject] ) ) | |
| 60 | {
| |
| 61 | if( IsPlayerInRangeOfPoint( playerid, 10.0, GateInfo[gate][gX], GateInfo[gate][gY], GateInfo[gate][gZ] ) ) | |
| 62 | {
| |
| 63 | if( GateInfo[gate][gStatus] == GATE_STATE_CLOSED ) | |
| 64 | {
| |
| 65 | MoveObject( GateInfo[gate][gObject], GateInfo[gate][gX], GateInfo[gate][gY], GateInfo[gate][gZ]-5.3, 7.0 ); | |
| 66 | SendClientMessage( playerid, -1, "You opened the gate." ); | |
| 67 | } | |
| 68 | ||
| 69 | else | |
| 70 | return SendClientMessage( playerid, -1, "The gate is already open." ); | |
| 71 | } | |
| 72 | ||
| 73 | else | |
| 74 | return SendClientMessage( playerid, -1, "You're not near any gate." ); | |
| 75 | } | |
| 76 | ||
| 77 | else | |
| 78 | return SendClientMessage( playerid, -1, "You must wait untill the gate has moved." ); | |
| 79 | } | |
| 80 | ||
| 81 | else | |
| 82 | return SendClientMessage( playerid, -1, "Invalid password." ); | |
| 83 | ||
| 84 | return 1; | |
| 85 | } | |
| 86 | ||
| 87 | CMD:gclose( playerid, params[] ) | |
| 88 | {
| |
| 89 | if( isnull( params ) ) | |
| 90 | return SendClientMessage( playerid, -1, "Syntax: /gclose [password]" ); | |
| 91 | ||
| 92 | new szName[24], gate = -1; | |
| 93 | GetPlayerName( playerid, szName, 24 ); | |
| 94 | for( new i = 0; i != MAX_GATES; i++ ) | |
| 95 | if( GateInfo[i][gCreated] == 1 ) | |
| 96 | if( strval( params ) == GateInfo[i][gPassword] ) | |
| 97 | { gate = i; break; }
| |
| 98 | ||
| 99 | if( gate != -1 ) | |
| 100 | {
| |
| 101 | if( !IsObjectMoving( GateInfo[gate][gObject] ) ) | |
| 102 | {
| |
| 103 | if( IsPlayerInRangeOfPoint( playerid, 10.0, GateInfo[gate][gX], GateInfo[gate][gY], GateInfo[gate][gZ] ) ) | |
| 104 | {
| |
| 105 | if( GateInfo[gate][gStatus] == GATE_STATE_OPEN ) | |
| 106 | {
| |
| 107 | MoveObject( GateInfo[gate][gObject], GateInfo[gate][gX], GateInfo[gate][gY], GateInfo[gate][gZ]+5.3, 7.0 ); | |
| 108 | SendClientMessage( playerid, -1, "You closed the gate." ); | |
| 109 | } | |
| 110 | ||
| 111 | else | |
| 112 | return SendClientMessage( playerid, -1, "The gate is already closed." ); | |
| 113 | } | |
| 114 | ||
| 115 | else | |
| 116 | return SendClientMessage( playerid, -1, "You're not near any gate." ); | |
| 117 | } | |
| 118 | ||
| 119 | else | |
| 120 | return SendClientMessage( playerid, -1, "You must wait untill the gate has moved." ); | |
| 121 | } | |
| 122 | ||
| 123 | else | |
| 124 | return SendClientMessage( playerid, -1, "Invalid password." ); | |
| 125 | ||
| 126 | return 1; | |
| 127 | } | |
| 128 | ||
| 129 | CMD:removegate( playerid, params[] ) | |
| 130 | {
| |
| 131 | for( new i = 0; i != MAX_GATES; i++ ) | |
| 132 | {
| |
| 133 | if( GateInfo[i][gCreated] == 1 ) | |
| 134 | {
| |
| 135 | if( IsPlayerInRangeOfPoint( playerid, 10.0, GateInfo[i][gX], GateInfo[i][gY], GateInfo[i][gZ] ) ) | |
| 136 | {
| |
| 137 | new szName[24]; | |
| 138 | GetPlayerName( playerid, szName, 24 ); | |
| 139 | if( !strcmp( szName, GateInfo[i][gPlacedBy], true ) || IsPlayerAdmin( playerid ) ) | |
| 140 | {
| |
| 141 | DestroyObject( GateInfo[i][gObject] ); | |
| 142 | format( GateInfo[i][gPlacedBy], 24, "None" ); | |
| 143 | GateInfo[i][gCreated] = 0; | |
| 144 | GateInfo[i][gX] = 0.0; | |
| 145 | GateInfo[i][gY] = 0.0; | |
| 146 | GateInfo[i][gZ] = 0.0; | |
| 147 | GateInfo[i][gA] = 0.0; | |
| 148 | GateInfo[i][gPassword] = 0; | |
| 149 | GateInfo[i][gStatus] = GATE_STATE_CLOSED; | |
| 150 | SendClientMessage( playerid, -1, "You removed the gate." ); | |
| 151 | ||
| 152 | new file[32]; | |
| 153 | format( file, 32, "Gates/gate_%d.ini", i ); | |
| 154 | if( dini_Exists( file ) ) | |
| 155 | dini_Remove( file ); | |
| 156 | break; | |
| 157 | } | |
| 158 | ||
| 159 | else | |
| 160 | return SendClientMessage( playerid, -1, "You don't own this gate." ); | |
| 161 | } | |
| 162 | ||
| 163 | else | |
| 164 | return SendClientMessage( playerid, -1, "You're not near any gate." ); | |
| 165 | } | |
| 166 | } | |
| 167 | ||
| 168 | return 1; | |
| 169 | } | |
| 170 | ||
| 171 | CMD:gateinfo( playerid, params[] ) | |
| 172 | {
| |
| 173 | if( IsPlayerAdmin( playerid ) ) | |
| 174 | {
| |
| 175 | for( new i = 0; i != MAX_GATES; i++ ) | |
| 176 | {
| |
| 177 | if( GateInfo[i][gCreated] == 1 ) | |
| 178 | {
| |
| 179 | if( IsPlayerInRangeOfPoint( playerid, 5.0, GateInfo[i][gX], GateInfo[i][gY], GateInfo[i][gZ] ) ) | |
| 180 | {
| |
| 181 | new szString[128]; | |
| 182 | format( szString, 128, "Gate Info( Placed by: %s | Password: %d)", GateInfo[i][gPlacedBy], GateInfo[i][gPassword] ); | |
| 183 | SendClientMessage( playerid, -1, szString ); | |
| 184 | return 1; | |
| 185 | } | |
| 186 | ||
| 187 | else | |
| 188 | return SendClientMessage( playerid, -1, "You're not near any gate." ); | |
| 189 | } | |
| 190 | } | |
| 191 | } | |
| 192 | ||
| 193 | else | |
| 194 | return SendClientMessage( playerid, -1, "You're not an admin." ); | |
| 195 | return 1; | |
| 196 | } | |
| 197 | ||
| 198 | public OnFilterScriptInit( ) | |
| 199 | {
| |
| 200 | for( new i = 0; i != MAX_GATES; i++ ) | |
| 201 | {
| |
| 202 | if( GateInfo[i][gCreated] == 0 ) | |
| 203 | {
| |
| 204 | new file[64]; | |
| 205 | format( file, 64, "Gates/gate_%d.ini", i ); | |
| 206 | if( fexist( file ) ) | |
| 207 | {
| |
| 208 | GateInfo[i][gCreated] = 1; | |
| 209 | GateInfo[i][gX] = dini_Float( file, "X" ); | |
| 210 | GateInfo[i][gY] = dini_Float( file, "Y" ); | |
| 211 | GateInfo[i][gZ] = dini_Float( file, "Z" ); | |
| 212 | GateInfo[i][gA] = dini_Float( file, "A" ); | |
| 213 | GateInfo[i][gStatus] = dini_Int( file, "Status" ); | |
| 214 | GateInfo[i][gPassword] = dini_Int( file, "Password" ); | |
| 215 | format( GateInfo[i][gPlacedBy], 24, dini_Get( file, "PlacedBy" ) ); | |
| 216 | GateInfo[i][gObject] = CreateObject( GATE_OBJECT, GateInfo[i][gX], GateInfo[i][gY], GateInfo[i][gZ], 0, 0, GateInfo[i][gA] ); | |
| 217 | } | |
| 218 | } | |
| 219 | } | |
| 220 | ||
| 221 | return 1; | |
| 222 | } | |
| 223 | ||
| 224 | public OnFilterScriptExit( ) | |
| 225 | {
| |
| 226 | for( new i = 0; i != MAX_GATES; i++ ) | |
| 227 | {
| |
| 228 | if( GateInfo[i][gCreated] == 1 ) | |
| 229 | {
| |
| 230 | new file[64]; | |
| 231 | format( file, 64, "Gates/gate_%d.ini", i ); | |
| 232 | if( fexist( file ) ) | |
| 233 | {
| |
| 234 | dini_IntSet( file, "Object", GateInfo[i][gObject] ); | |
| 235 | dini_FloatSet( file, "X", GateInfo[i][gX] ); | |
| 236 | dini_FloatSet( file, "Y", GateInfo[i][gY] ); | |
| 237 | dini_FloatSet( file, "Z", GateInfo[i][gZ] ); | |
| 238 | dini_FloatSet( file, "A", GateInfo[i][gA] ); | |
| 239 | dini_IntSet( file, "Status", GateInfo[i][gStatus] ); | |
| 240 | dini_IntSet( file, "Password", GateInfo[i][gPassword] ); | |
| 241 | dini_Set( file, "PlacedBy", GateInfo[i][gPlacedBy] ); | |
| 242 | DestroyObject( GateInfo[i][gObject] ); | |
| 243 | format( GateInfo[i][gPlacedBy], 24, "None" ); | |
| 244 | GateInfo[i][gCreated] = 0; | |
| 245 | GateInfo[i][gX] = 0.0; | |
| 246 | GateInfo[i][gY] = 0.0; | |
| 247 | GateInfo[i][gZ] = 0.0; | |
| 248 | GateInfo[i][gA] = 0.0; | |
| 249 | GateInfo[i][gStatus] = GATE_STATE_CLOSED; | |
| 250 | } | |
| 251 | } | |
| 252 | } | |
| 253 | ||
| 254 | return 1; | |
| 255 | } | |
| 256 | ||
| 257 | public OnObjectMoved( objectid ) | |
| 258 | {
| |
| 259 | for( new i = 0; i != MAX_GATES; i++ ) | |
| 260 | {
| |
| 261 | if( GateInfo[i][gCreated] == 1 ) | |
| 262 | {
| |
| 263 | if( GateInfo[i][gObject] == objectid ) | |
| 264 | {
| |
| 265 | if( GateInfo[i][gStatus] == GATE_STATE_CLOSED ) | |
| 266 | GateInfo[i][gStatus] = GATE_STATE_OPEN; | |
| 267 | else if( GateInfo[i][gStatus] == GATE_STATE_OPEN ) | |
| 268 | GateInfo[i][gStatus] = GATE_STATE_CLOSED; | |
| 269 | ||
| 270 | // Update the variables. | |
| 271 | new Float:oPos[3]; | |
| 272 | GetObjectPos( objectid, oPos[0], oPos[1], oPos[2] ); | |
| 273 | GateInfo[i][gX] = oPos[0]; | |
| 274 | GateInfo[i][gY] = oPos[1]; | |
| 275 | GateInfo[i][gZ] = oPos[2]; | |
| 276 | break; | |
| 277 | } | |
| 278 | } | |
| 279 | } | |
| 280 | ||
| 281 | return 1; | |
| 282 | } | |
| 283 | ||
| 284 | stock CreateGate( playerid, password, Float:x, Float:y, Float:z, Float:a ) | |
| 285 | {
| |
| 286 | for( new i = 0; i != MAX_GATES; i++ ) | |
| 287 | {
| |
| 288 | if( GateInfo[i][gCreated] == 0 ) | |
| 289 | {
| |
| 290 | new szName[24]; | |
| 291 | GetPlayerName( playerid, szName, 24 ); | |
| 292 | ||
| 293 | GateInfo[i][gObject] = CreateObject( GATE_OBJECT, x, y, z+1.5, 0, 0, a ); | |
| 294 | format( GateInfo[i][gPlacedBy], 24, "%s", szName ); | |
| 295 | GateInfo[i][gCreated] = 1; | |
| 296 | GateInfo[i][gX] = x; | |
| 297 | GateInfo[i][gY] = y; | |
| 298 | GateInfo[i][gZ] = z+1.5; // comment the +1.5 if you're not using object 980. | |
| 299 | GateInfo[i][gA] = a; | |
| 300 | GateInfo[i][gStatus] = GATE_STATE_CLOSED; | |
| 301 | GateInfo[i][gPassword] = password; | |
| 302 | SetPlayerPos( playerid, x+1, y+1, z ); | |
| 303 | ||
| 304 | new file[64]; | |
| 305 | format( file, 64, "Gates/gate_%d.ini", i ); | |
| 306 | if( !fexist( file ) ) | |
| 307 | {
| |
| 308 | dini_Create( file ); | |
| 309 | dini_IntSet( file, "Object", GateInfo[i][gObject] ); | |
| 310 | dini_FloatSet( file, "X", GateInfo[i][gX] ); | |
| 311 | dini_FloatSet( file, "Y", GateInfo[i][gY] ); | |
| 312 | dini_FloatSet( file, "Z", GateInfo[i][gZ] ); | |
| 313 | dini_FloatSet( file, "A", GateInfo[i][gA] ); | |
| 314 | dini_IntSet( file, "Status", GateInfo[i][gStatus] ); | |
| 315 | dini_Set( file, "PlacedBy", GateInfo[i][gPlacedBy] ); | |
| 316 | } | |
| 317 | break; | |
| 318 | } | |
| 319 | } | |
| 320 | } |