View difference between Paste ID: QKBpK4dP and h5PUKFGf
SHOW: | | - or go back to the newest paste.
1
/*       __  __
2
      /\ \/\ \
3
  ____\ \ \_\ \    ___   __  __    ____     __
4
 /',__\\ \  _  \  / __`\/\ \/\ \  /',__\  /'__`\
5
/\__, `\\ \ \ \ \/\ \ \ \ \ \_\ \/\__, `\/\  __/
6
\/\____/ \ \_\ \_\ \____/\ \____/\/\____/\ \____\
7
 \/___/   \/_/\/_/\/___/  \/___/  \/___/  \/____/
8
9
*/
10
/*
11
============[ChangeLog]==========//
12
8/01/2011 [1.0.0] - Initial Release
13
9/01/2011 [1.0.1] - Fixed 3D Text Labels
14
                  - Fixed bugged when you destroy a house
15
		          - Added 3 more interiors
16
		          - Fixed a bug with Virtual worlds
17
*/
18
//==========[Includes]==========//
19
#include <a_samp>//by SA-MP Team
20
#include <zcmd>//by Zeex
21
#include <sscanf2>//by Y_Less
22
#include <mysql>//by StrickenKid
23
#include <seif_text>//by Seif
24
#include <streamer>//by Incognito
25
//==========[Database]==========//
26
#define SQL_HOST "localhost"// Your MySQL Host
27
#define SQL_USER "root"// Your MySQL username(usually root)
28
#define SQL_PASS ""// Your MySQL Password
29
#define SQL_DB "samp"// Your MySQL database (default samp)
30
//==========[Shit]==========//
31
#define function%0(%1) forward%0(%1); public%0(%1)
32
#define MAX_HOUSES 50
33
#define SCRIPT_VERSION "1.0.1"
34
#define SCRIPT_AUTHOR "Souvlaki"
35
//-------------------------------------------------------------------------------------//
36
#define GREEN                   0x007C00AA
37
#define ORANGE					0xF68B00AA
38
//-------------------------------------------------------------------------------------//
39
new Text3D:HouseText[MAX_HOUSES];
40
new sArray[5];
41
//-------------------------------------------------------------------------------------//
42
enum hInfo
43
{
44
	hID,
45
	hOwned,
46
	hOwner[24],
47
	Float:hEntranceX,
48
	Float:hEntranceY,
49
	Float:hEntranceZ,
50
	Float:hExitX,
51
	Float:hExitY,
52
	Float:hExitZ,
53
	hInterior,
54
	hOpen,
55
	hPickup,
56
	hPrice
57
};
58
new HouseInfo[MAX_HOUSES][hInfo];
59
//-------------------------------------------------------------------------------------//
60
public OnFilterScriptInit()
61
{
62
	print("--------------------------------------\n");
63
	print("sHouse version 1.0.1 Loaded");
64
	print("\n--------------------------------------");
65
 	mysql_init(LOG_ALL, 1);
66
    mysql_connect(SQL_HOST, SQL_USER, SQL_PASS, SQL_DB);
67
	LoadSHouses();
68
	return 1;
69
}
70
//-------------------------------------------------------------------------------------//
71
public OnFilterScriptExit()
72
{
73
	print("--------------------------------------\n");
74
	print("sHouse version 1.0.1 Unloaded");
75
	print("\n--------------------------------------");
76
    for(new id; id < MAX_HOUSES; id++)
77
    {
78
    	SaveSHouse(id);
79
	}
80
	return 1;
81
}
82
//-------------------------------------------------------------------------------------//
83
public OnPlayerConnect(playerid)
84
{
85
	DisplayTextForPlayer(playerid, "sHouse", 5, 3, 3);
86
	return 1;
87
}
88
//-------------------------------------------------------------------------------------//
89
function OnPlayerPickUpDynamicPickup(playerid, pickupid)
90
{
91
	new string[128];
92
	for(new id = 0; id < sizeof(HouseInfo); id++)
93
	{
94
		if(IsPlayerInRangeOfPoint(playerid, 2.0, HouseInfo[id][hEntranceX], HouseInfo[id][hEntranceY], HouseInfo[id][hEntranceZ]))
95
		{
96
			if(HouseInfo[id][hOwned] == 0)
97
			{
98
			format(string,sizeof(string),"~r~Property~n~~w~For Sale~n~~y~~h~Price:~w~ %d",HouseInfo[id][hPrice]);
99
			DisplayTextForPlayer(playerid, string, 5, 3, 3);
100
			}
101
			else if(HouseInfo[id][hOwned] == 1)
102
			{
103
			format(string,sizeof(string),"~r~Property~n~~y~~h~Owner:~w~ %s",HouseInfo[id][hOwner], HouseInfo[id][hPrice]);
104
			DisplayTextForPlayer(playerid, string, 5, 3, 3);
105
			}
106
		}
107
	}
108
	return 1;
109
}
110
//-------------------------------------------------------------------------------------//
111
COMMAND:enter(playerid, params[])
112
{
113
	#pragma unused params
114
	for(new id = 0; id < sizeof(HouseInfo); id++)
115
	{
116
		if(IsPlayerInRangeOfPoint(playerid, 2.0, HouseInfo[id][hEntranceX], HouseInfo[id][hEntranceY], HouseInfo[id][hEntranceZ]))
117
		{
118
		    if(HouseInfo[id][hOpen] == 0)
119
		    {
120
		        DisplayTextForPlayer(playerid,"~r~Locked",2, 1, 1);
121
		    }
122
	    	else
123
	    	{
124
	    	    SetPlayerPos(playerid, HouseInfo[id][hExitX], HouseInfo[id][hExitY], HouseInfo[id][hExitZ]);
125
	    		SetPlayerInterior(playerid, HouseInfo[id][hInterior]);
126
	    		SetPlayerVirtualWorld(playerid, id);
127
	    	}
128
		}
129
	}
130
	return 1;
131
}
132
//-------------------------------------------------------------------------------------//
133
COMMAND:exit(playerid, params[])
134
{
135
	#pragma unused params
136
	for(new id = 0; id < sizeof(HouseInfo); id++)
137
	{
138
		if(IsPlayerInRangeOfPoint(playerid, 5.0, HouseInfo[id][hExitX], HouseInfo[id][hExitY], HouseInfo[id][hExitZ]))
139
		{
140
	    	SetPlayerPos(playerid,  HouseInfo[id][hEntranceX], HouseInfo[id][hEntranceY], HouseInfo[id][hEntranceZ]);
141
	    	SetPlayerInterior(playerid, 0);
142
	    	SetPlayerVirtualWorld(playerid, 0);
143
		}
144
	}
145
	return 1;
146
}
147
//-------------------------------------------------------------------------------------//
148
COMMAND:createhouse(playerid, params[])
149
{
150
	if(sscanf(params, "ii", sArray[0], sArray[1]))
151
	{
152
		SendClientMessage(playerid, GREEN, "[SYNTAX]: /createhouse [Price] [Interior (1-3)]");
153
        SendClientMessage(playerid, ORANGE, "[Interiors]: Large/2 story/3 bedrooms (1) | 	Medium/1 story/1 bedroom  (2) | Small/1 story/1 bedroom  (3)");
154
        SendClientMessage(playerid, ORANGE, "[Interiors]: 	VERY Large/2 story/4 bedrooms  (4) | 	Small/1 story/2 bedrooms   (5) | Small/1 story/2 bedrooms  (6)");
155
		return 1;
156
	}
157
    if(IsPlayerAdmin(playerid))
158
	{
159
		if(sArray[1] > 3 && sArray[1] < 1) return SendClientMessage(playerid, ORANGE, "[Interiors]: House Large 1 (1) | House Medium (2) | House Small (3)");
160
    	new Float:PlayerPos[3];
161
    	GetPlayerPos(playerid, PlayerPos[0], PlayerPos[1], PlayerPos[2]);
162
    	CreateSHouse(PlayerPos[0], PlayerPos[1], PlayerPos[2], sArray[0], sArray[1]);
163
    }
164
    else
165
	{
166
        SendClientMessage(playerid, ORANGE, "[ERROR]: You ain't no RCON admin, you piece of shit motherfucker.");
167
    }
168
    return 1;
169
}
170
//-------------------------------------------------------------------------------------//
171
COMMAND:movehouse(playerid, params[])
172
{
173
	if(sscanf(params, "i", sArray[0])) return SendClientMessage(playerid, GREEN, "[SYNTAX]: /movehouse [HouseID]");
174
    if(IsPlayerAdmin(playerid))
175
	{
176
        new Float:PlayerPos[3];
177
        GetPlayerPos(playerid, PlayerPos[0], PlayerPos[1], PlayerPos[2]);
178
		Delete3DTextLabel(HouseText[sArray[0]]);
179
		DestroyDynamicPickup(HouseInfo[sArray[0]][hPickup]);
180
		HouseInfo[sArray[0]][hEntranceX] = PlayerPos[0];
181
		HouseInfo[sArray[0]][hEntranceY] = PlayerPos[1];
182
		HouseInfo[sArray[0]][hEntranceZ] = PlayerPos[2];
183
		SaveSHouse(sArray[0]);
184
		if(HouseInfo[sArray[0]][hOwned] == 0)
185
			{
186
				HouseInfo[sArray[0]][hPickup] = CreateDynamicPickup(1273, 1, HouseInfo[sArray[0]][hEntranceX], HouseInfo[sArray[0]][hEntranceY], HouseInfo[sArray[0]][hEntranceZ]);
187
			}
188
			else if(HouseInfo[sArray[0]][hOwned] == 1)
189
			{
190
				HouseInfo[sArray[0]][hPickup] = CreateDynamicPickup(1239, 1, HouseInfo[sArray[0]][hEntranceX], HouseInfo[sArray[0]][hEntranceY], HouseInfo[sArray[0]][hEntranceZ]);
191
			}
192
    }
193
    else
194
	{
195
        SendClientMessage(playerid, ORANGE, "[ERROR]: You ain't no RCON admin, you piece of shit motherfucker.");
196
    }
197
    return 1;
198
}
199
//-------------------------------------------------------------------------------------//
200
COMMAND:destroyhouse(playerid, params[])
201
 {
202
	new string[256];
203
	if(sscanf(params, "i", sArray[0])) return SendClientMessage(playerid, GREEN, "[SYNTAX]: /destroyhouse [id]");
204
    if(IsPlayerAdmin(playerid))
205
	{
206
        format(string, sizeof(string), "DELETE FROM Houses WHERE id = %i", sArray[0]);
207
        mysql_query(string);
208
        DestroyDynamic3DTextLabel(HouseText[sArray[0]]);
209
        DestroyDynamicPickup(HouseInfo[sArray[0]][hPickup]);
210
        mysql_query("SELECT MAX(id) FROM Houses");
211
		mysql_store_result();
212
		new SQL[20];
213
		mysql_fetch_row(SQL, "|");
214
		new SQLID = strval(SQL);
215
		mysql_free_result();
216
		format(string, sizeof(string), "ALTER TABLE `Houses`  AUTO_INCREMENT =%i", SQLID);
217
		mysql_query(string);
218
		//SaveSHouse([sArray[0]]);
219
    }
220
    else
221
	{
222
        SendClientMessage(playerid, ORANGE, "[ERROR]: You ain't no RCON admin, you piece of shit motherfucker.");
223
    }
224
    return 1;
225
}
226
//-------------------------------------------------------------------------------------//
227
COMMAND:shouse(playerid, params[])
228
{
229
    if(IsPlayerAdmin(playerid))
230
	{
231
	SendClientMessage(playerid, GREEN, "[HELP]: /createhouse [Price] [Interior (1-3)][Will create a house at your position].");
232
	SendClientMessage(playerid, GREEN, "[HELP]: /movehouse [HouseID] [Will move a house to your position].");
233
	SendClientMessage(playerid, GREEN, "[HELP]: /destroyhouse [HouseID] [Will move a house with the selected ID].");
234
	SendClientMessage(playerid, GREEN, "[HELP]: /househelp [Player Commands for houses].");
235
    }
236
    else
237
	{
238
        SendClientMessage(playerid, ORANGE, "[ERROR]: You ain't no RCON admin, you piece of shit motherfucker.");
239
    }
240
    return 1;
241
}//	
242
//-------------------------------------------------------------------------------------//
243
COMMAND:househelp(playerid, params[])
244
{
245
	SendClientMessage(playerid, GREEN, "[HELP]: /buyhouse [You can buy a house].");
246
	SendClientMessage(playerid, GREEN, "[HELP]: /sellhouse [You will sell your house].");
247
	SendClientMessage(playerid, GREEN, "[HELP]: /lock [You will lock/unlock your house].");
248
    return 1;
249
}
250
//-------------------------------------------------------------------------------------//
251
COMMAND:buyhouse(playerid, params[])
252
{
253
			new id = IsPlayerNearByHouse(playerid);
254
			if(HouseInfo[id][hOwned] == 1) return SendClientMessage(playerid, ORANGE, "[ERROR]This house is already owned!");
255
			if(GetPlayerMoney(playerid) >= HouseInfo[id][hPrice])
256
			{
257
			    GivePlayerMoney(playerid, -HouseInfo[id][hPrice]);
258
			    HouseInfo[id][hOwned] = 1;
259
			    strmid(HouseInfo[id][hOwner], GetPlayerNameRP(playerid), 0, strlen(GetPlayerNameRP(playerid)), 255);
260
			    DestroyDynamicPickup(HouseInfo[id][hPickup]);
261
				HouseInfo[id][hPickup] = CreateDynamicPickup(1239, 1, HouseInfo[id][hEntranceX], HouseInfo[id][hEntranceY], HouseInfo[id][hEntranceZ]);
262
			    Update3DTextLabels();
263
				SaveSHouse(id);
264
			}
265
			else return SendClientMessage(playerid, ORANGE, "[ERROR]You don't have enought money to buy this house!");
266
			return 1;
267
}
268
//-------------------------------------------------------------------------------------//
269
COMMAND:sellhouse(playerid, params[])
270
{
271
			new id = IsPlayerNearByHouse(playerid);
272
			if(HouseInfo[id][hOwned] == 0) return SendClientMessage(playerid, ORANGE, "[ERROR]This house is already for sale!");
273
			if(!strcmp(GetPlayerNameRP(playerid), HouseInfo[id][hOwner], true))
274
			{
275
			    GivePlayerMoney(playerid, HouseInfo[id][hPrice]);
276
			    HouseInfo[id][hOwned] = 0;
277
			    strmid(HouseInfo[id][hOwner], "None", 0, strlen("None"), 255);
278
			    DestroyDynamicPickup(HouseInfo[id][hPickup]);
279
				HouseInfo[id][hPickup] = CreateDynamicPickup(1273, 1, HouseInfo[id][hEntranceX], HouseInfo[id][hEntranceY], HouseInfo[id][hEntranceZ]);
280
			    Update3DTextLabels();
281
				SaveSHouse(id);
282
			}
283
			else return SendClientMessage(playerid, ORANGE, "[ERROR]You don't own this house!");
284
			return 1;
285
}
286
//-------------------------------------------------------------------------------------//
287
COMMAND:lock(playerid, params[])
288
{
289
	new id = IsPlayerNearByHouse(playerid);
290
	if(id != -1)
291
	{
292
		if(!strcmp(GetPlayerNameRP(playerid), HouseInfo[id][hOwner], true))
293
		{
294
			if(HouseInfo[id][hOpen] == 0)
295
			{
296
				SendClientMessage(playerid, ORANGE, "[INFO]Door Unlocked!");
297
				HouseInfo[id][hOpen] = 1;
298
				SaveSHouse(id);
299
			}
300
			else
301
			{
302
				HouseInfo[id][hOpen] = 0;
303
				SendClientMessage(playerid, ORANGE, "[INFO]Door locked!");
304
				SaveSHouse(id);
305
			}
306
  		}
307
	}
308
	return 1;
309
}
310
//-------------------------------------------------------------------------------------//
311
function LoadSHouses()
312
{
313
    for(new id; id < MAX_HOUSES; id++)
314
    {
315
	    new DataString[128], Query[128];
316
	    format( Query, sizeof( Query ), "SELECT * FROM Houses WHERE id= '%d'", id);
317
		mysql_query(Query);
318
		mysql_store_result();
319
  		if(mysql_num_rows())
320
        if(mysql_fetch_row(Query,"|")) 
321
        {
322
323
        mysql_fetch_field("id", DataString);
324
		HouseInfo[id][hID] = strval(DataString);
325
326
        mysql_fetch_field("Owned", DataString);
327
		HouseInfo[id][hOwned] = strval(DataString);
328
329
        mysql_fetch_field("Owner", DataString);
330
		HouseInfo[id][hOwner] = strval(DataString);
331
332
        mysql_fetch_field("EntranceX", DataString);
333
		HouseInfo[id][hEntranceX] = floatstr(DataString);
334
335
        mysql_fetch_field("EntranceY", DataString);
336
		HouseInfo[id][hEntranceY] = floatstr(DataString);
337
338
        mysql_fetch_field("EntranceZ", DataString);
339
		HouseInfo[id][hEntranceZ] = floatstr(DataString);
340
341
        mysql_fetch_field("ExitX", DataString);
342
		HouseInfo[id][hExitX] = floatstr(DataString);
343
344
        mysql_fetch_field("ExitY", DataString);
345
		HouseInfo[id][hExitY] = floatstr(DataString);
346
347
        mysql_fetch_field("ExitZ", DataString);
348
		HouseInfo[id][hExitZ] = floatstr(DataString);
349
350
		mysql_fetch_field("Interior", DataString);
351
		HouseInfo[id][hInterior] = strval(DataString);
352
353
        mysql_fetch_field("Open", DataString);
354
		HouseInfo[id][hOpen] = strval(DataString);
355
356
        mysql_fetch_field("Pickup", DataString);
357
		HouseInfo[id][hPickup] = strval(DataString);
358
359
360
        mysql_fetch_field("Price", DataString);
361
		HouseInfo[id][hPrice] = strval(DataString);
362
		mysql_free_result();
363
		if(HouseInfo[id][hOwned] == 0)
364
			{
365
				HouseText[id] = CreateDynamic3DTextLabel("[HOUSE FOR SALE]", GREEN, HouseInfo[id][hEntranceX], HouseInfo[id][hEntranceY], HouseInfo[id][hEntranceZ]+0.75, 75.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, -1, -1, -1, 75.0);
366
				HouseInfo[id][hPickup] = CreateDynamicPickup(1273, 1, HouseInfo[id][hEntranceX], HouseInfo[id][hEntranceY], HouseInfo[id][hEntranceZ]);
367
			}
368
			else if(HouseInfo[id][hOwned] == 1)
369
			{
370
				HouseText[id] = CreateDynamic3DTextLabel("[HOUSE]", GREEN, HouseInfo[id][hEntranceX], HouseInfo[id][hEntranceY], HouseInfo[id][hEntranceZ]+0.75, 75.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, -1, -1, -1, 75.0);
371
				HouseInfo[id][hPickup] = CreateDynamicPickup(1239, 1, HouseInfo[id][hEntranceX], HouseInfo[id][hEntranceY], HouseInfo[id][hEntranceZ]);
372
			}
373
  		}
374
	}
375
	return 1;
376
}
377
//-------------------------------------------------------------------------------------//
378
function Update3DTextLabels()
379
{
380
	new string[64];
381
	for(new id = 0; id < sizeof(HouseInfo); id++)
382
	{
383
		if(HouseInfo[id][hOwned] == 0)
384
		{
385
		    format(string,sizeof(string), "[HOUSE FOR SALE]");
386
		}
387
		else if(HouseInfo[id][hOwned] == 1)
388
		{
389
  		format(string,sizeof(string), "[HOUSE]");
390
		}
391
    	UpdateDynamic3DTextLabelText(HouseText[id], GREEN,string);
392
	}
393
	return 1;
394
}
395
//-------------------------------------------------------------------------------------//
396
function CreateSHouse(Float:X, Float:Y, Float:Z, price, interior)
397
{
398
	new string[256];
399
 	format(string, sizeof(string), "INSERT INTO Houses (EntranceX, EntranceY, EntranceZ, Price, Owner) VALUES('%f', '%f', '%f',  %i , 'None')",
400
 	X, Y, Z, price);
401
 	mysql_query(string);
402
 	mysql_query("SELECT MAX(id) FROM Houses");
403
	mysql_store_result();
404
	new SQL[20];
405
	mysql_fetch_row(SQL, "|");
406
	new id = strval(SQL);
407
	HouseInfo[id][hPrice] = price;
408
	HouseInfo[id][hEntranceX] = X;
409
	HouseInfo[id][hEntranceY] = Y;
410
	HouseInfo[id][hEntranceZ] = Z;
411
	strmid(HouseInfo[id][hOwner], "None", 0, strlen("None"), 255);
412
	switch(interior)
413
	{
414
	    case 1:
415
		{ 	//Large/2 story/3 bedrooms/
416
            SetHouseDetails(id, 3	 ,235.508994, 1189.169897 ,1080.339966);
417
	    }
418
	    case 2:
419
		{ //Medium/1 story/1 bedroom
420
   			SetHouseDetails(id,2,	 225.756989, 1240.000000, 1082.149902);
421
	    }
422
	    case 3:
423
		{ //Small/1 story/1 bedroom
424
   			SetHouseDetails(id, 1,	 223.043991	, 1289.259888, 1082.199951);
425
	    }
426
	    case 4:
427
		{ //VERY Large/2 story/4 bedrooms
428
   			SetHouseDetails(id, 7,	 225.630997, 1022.479980, 1084.069946 );
429
	    }
430
	    case 5:
431
		{ //Small/1 story/2 bedrooms
432
   			SetHouseDetails(id, 15,	 295.138977, 1474.469971, 1080.519897);
433
	    }
434
	    case 6:
435
		{ //Small/1 story/2 bedrooms
436
   			SetHouseDetails(id, 15,	 328.493988, 1480.589966, 1084.449951 );
437
	    }
438
	}
439
	SaveSHouse(id);
440
	HouseInfo[id][hPickup] = CreateDynamicPickup(1273, 1, HouseInfo[id][hEntranceX], HouseInfo[id][hEntranceY], HouseInfo[id][hEntranceZ]);
441
	HouseText[id] = CreateDynamic3DTextLabel("[HOUSE FOR SALE]", GREEN, HouseInfo[id][hEntranceX], HouseInfo[id][hEntranceY], HouseInfo[id][hEntranceZ]+0.75, 75.0, INVALID_PLAYER_ID, INVALID_VEHICLE_ID, 0, -1, -1, -1, 75.0);
442
	return 1;
443
}
444
//-------------------------------------------------------------------------------------//
445
function SetHouseDetails(id, interiorid, Float:X, Float:Y, Float:Z)
446
{
447
    HouseInfo[id][hInterior] = interiorid;
448
    HouseInfo[id][hExitX] = X;
449
    HouseInfo[id][hExitY] = Y;
450
    HouseInfo[id][hExitZ] = Z;
451
    SaveSHouse(id);
452
}
453
//-------------------------------------------------------------------------------------//
454
function SaveSHouse(id)
455
{
456
	new string[256];
457
	format(string, sizeof(string), "UPDATE Houses SET EntranceX='%f',EntranceY='%f',EntranceZ='%f', \
458
	Interior= %i,ExitX='%f',ExitY='%f',ExitZ='%f', Price= %i,Owner='%s',Owned= %i ,Open= %i WHERE id = %i ",
459
	HouseInfo[id][hEntranceX],HouseInfo[id][hEntranceY],HouseInfo[id][hEntranceZ],
460
	HouseInfo[id][hInterior],HouseInfo[id][hExitX],HouseInfo[id][hExitY],
461
	HouseInfo[id][hExitZ],HouseInfo[id][hPrice],HouseInfo[id][hOwner],
462
	HouseInfo[id][hOwned], HouseInfo[id][hOpen], id);
463
	mysql_query(string);
464
}
465
//-------------------------------------------------------------------------------------//
466
function IsPlayerNearByHouse(playerid)
467
{
468
    for(new id = 0; id < sizeof(HouseInfo); id++)
469
    {
470
        if(IsPlayerInRangeOfPoint(playerid, 5.0, HouseInfo[id][hEntranceX], HouseInfo[id][hEntranceY], HouseInfo[id][hEntranceZ]))
471
        {
472
            return id;
473
        }
474
    }
475
    return -1;
476
}
477
//-------------------------------------------------------------------------------------//
478
stock GetPlayerNameRP(playerid)
479
{
480
	new player[MAX_PLAYER_NAME];
481
	GetPlayerName(playerid, player, sizeof(player));
482
	for(new i = 0; i < MAX_PLAYER_NAME; i++)
483
	{
484
        if (player[i] == '_') player[i] = ' ';
485
    }
486
	return player;
487
}