· 7 years ago · Sep 08, 2018, 03:50 PM
1/*
2 * 'Scripter: CaptainBoi'
3 * 'Version: 1.0'
4 * 'Released: 08-09-2018'
5 *
6 */
7
8/* Includes */
9#include <a_samp>
10#include <a_mysql>
11#include <streamer>
12#include <sscanf2>
13#include <zcmd>
14
15/* MySQL Entities */
16#define MYSQL_HOST ""
17#define MYSQL_USER ""
18#define MYSQL_PASS ""
19#define MYSQL_DB ""
20
21/* DB Name */
22new MySQL: ObjectsDB;
23
24/* Enumerator */
25enum objectinfo
26{
27 O_TAKEN,
28 O_MODEL,
29 Text3D:O_TEXTID,
30 O_ID,
31 Float:O_X,
32 Float:O_Y,
33 Float:O_Z,
34 Float:O_A,
35 O_INT,
36 O_VW
37}
38
39new oInfo[MAX_OBJECTS][objectinfo];
40new EditingObject[MAX_PLAYERS];
41new gObjCount= 0;
42
43/* Format Message With String */
44new string2[100], bool:False = false;
45#define format2(%0,%1,%2,%3) do{ format(string2, sizeof (string2), (%2), %3); SendClientMessage((%0),(%1), string2); } while (False)
46
47public OnFilterScriptInit()
48{
49 print("\n--------------------------------------");
50 print(" Dynamic Object System By CaptainBoi");
51 print("--------------------------------------\n");
52 new MySQLOpt: option_id = mysql_init_options();
53 mysql_set_option(option_id, AUTO_RECONNECT, true);
54 ObjectsDB = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS, MYSQL_DB, option_id);
55 if(ObjectsDB == MYSQL_INVALID_HANDLE || mysql_errno(ObjectsDB) != 0)
56 {
57 print("Cannot connect to mysql database");
58
59 SendRconCommand("exit");
60 return 1;
61 }
62 else print("Connected to mysql database.");
63 /* Objects Database */
64 mysql_query(ObjectsDB, "CREATE TABLE IF NOT EXISTS `objects` (\
65 `ID` INT, \
66 `Model` INT(10), \
67 `Taken` INT, \
68 `X` FLOAT DEFAULT 0, \
69 `Y` FLOAT DEFAULT 0, \
70 `Z` FLOAT DEFAULT 0, \
71 `Angle` FLOAT DEFAULT 0, \
72 `Interior` INT, \
73 `VirtualWorld` INT)");
74 mysql_tquery(ObjectsDB, "SELECT * FROM `objects`", "LoadDynamicObjects", "");
75 LoadDynamicObjects();
76 return 1;
77}
78
79public OnFilterScriptExit()
80{
81 SaveDynamicObjects();
82 mysql_close(ObjectsDB);
83 return 1;
84}
85
86public OnPlayerConnect(playerid)
87{
88 EditingObject[playerid] = -1;
89 return 1;
90}
91
92public OnPlayerDisconnect(playerid, reason)
93{
94 EditingObject[playerid] = -1;
95 return 1;
96}
97
98/* Commands */
99CMD:createobject(playerid, params[])
100{
101 new id = GetNextObjectID(), modelid;
102 if(sscanf(params, "d", modelid)) return SendClientMessage(playerid, -1, "USAGE: /createobject [modelid]");
103 GetPlayerPos(playerid, oInfo[id][O_X], oInfo[id][O_Y], oInfo[id][O_Z]);
104 GetPlayerFacingAngle(playerid, oInfo[id][O_A]);
105 GetXYInFrontOfPlayer(playerid, oInfo[id][O_X], oInfo[id][O_Y], 2.0);
106
107 oInfo[id][O_TAKEN] = 1;
108 oInfo[id][O_MODEL] = modelid;
109 oInfo[id][O_INT] = GetPlayerInterior(playerid);
110 oInfo[id][O_VW] = GetPlayerVirtualWorld(playerid);
111 oInfo[id][O_A] += 90;
112
113 SendClientMessage(playerid, 0xFFFF00FF, "You have created an Object.");
114
115 new TEXTLABEL[16];
116 format(TEXTLABEL, sizeof(TEXTLABEL), "Object\nID: %d", id);
117 gObjCount++;
118 oInfo[id][O_TEXTID] = CreateDynamic3DTextLabel(TEXTLABEL, 0x1D9F00AA, oInfo[id][O_X], oInfo[id][O_Y], oInfo[id][O_Z]+1.5, 5.0, _, _, _, oInfo[id][O_VW], oInfo[id][O_INT], _, _);
119 oInfo[id][O_ID] = CreateDynamicObject(modelid, oInfo[id][O_X], oInfo[id][O_Y], oInfo[id][O_Z], 0.0, 0.0, oInfo[id][O_A], oInfo[id][O_VW], oInfo[id][O_INT], _, _);
120 SaveDynamicObjects();
121 return 1;
122}
123
124CMD:deleteobject(playerid, params[])
125{
126 new id, query[200];
127 if(sscanf(params, "d", id)) return SendClientMessage(playerid, -1, "USAGE: /deleteobject [id]");
128 DestroyDynamic3DTextLabel(oInfo[id][O_TEXTID]);
129 DestroyDynamicObject(oInfo[id][O_ID]);
130 oInfo[id][O_TAKEN] = 0;
131 oInfo[id][O_X] = 0.0;
132 oInfo[id][O_Y] = 0.0;
133 oInfo[id][O_Z] = 0.0;
134 oInfo[id][O_A] = 0;
135 mysql_format(ObjectsDB,query,sizeof(query),"SELECT `ID` FROM `objects` WHERE `ID` = '%d'",id);
136 mysql_query(ObjectsDB, query);
137 new rows;
138 cache_get_row_count(rows);
139 if(rows != 0)
140 {
141 mysql_format(ObjectsDB, query, sizeof(query), "DELETE FROM `objects` WHERE (`ID` = '%d')", id);
142 mysql_query(ObjectsDB, query);
143 format2(playerid, -1, "Object: %d has been removed", id);
144 return 1;
145 }
146 else
147 {
148 format2(playerid, -1, "Object: %d does not exist.", id);
149 }
150 return 1;
151}
152
153CMD:editobject(playerid, params[])
154{
155 if(!gObjCount) {
156 return SendClientMessage(playerid, 0xFFFFFFFF, "SERVER: No Objects have been created.");
157 }
158 new object;
159 if(sscanf(params, "d", object)) return SendClientMessage(playerid, -1, "USAGE: /editobject [id]");
160 DestroyDynamic3DTextLabel(oInfo[object][O_TEXTID]);
161 EditDynamicObject(playerid, oInfo[object][O_ID]);
162 EditingObject[playerid] = object;
163 return 1;
164}
165
166/* Stocks */
167GetXYInFrontOfPlayer(playerid, &Float:x, &Float:y, Float:distance)
168{
169 new Float:a;
170 GetPlayerPos(playerid, x, y, a);
171 if (IsPlayerInAnyVehicle(playerid))
172 GetVehicleZAngle(GetPlayerVehicleID(playerid), a);
173 else
174 GetPlayerFacingAngle(playerid, a);
175 x += (distance * floatsin(-a, degrees));
176 y += (distance * floatcos(-a, degrees));
177}
178
179GetNextObjectID()
180{
181 new i=0;
182 while(i != MAX_OBJECTS) {
183 if(oInfo[i][O_TAKEN] == 0) {
184 return i;
185 }
186 i++;
187 }
188 return -1;
189}
190
191/* Forwards & Publics */
192forward SaveDynamicObjects();
193public SaveDynamicObjects()
194{
195 new szQuery[270], ID, time = GetTickCount(), objcount;
196 for(new i=0; i<MAX_OBJECTS; i++)
197 {
198 if(oInfo[i][O_TAKEN] == 1)
199 {
200 objcount++;
201 mysql_format(ObjectsDB, szQuery, sizeof(szQuery), "INSERT INTO `objects` (`ID`, `Taken`) VALUES ('%d', '1')", ID);
202 mysql_tquery(ObjectsDB, szQuery, "", "");
203 mysql_format(ObjectsDB, szQuery, sizeof(szQuery), "UPDATE `objects` SET `Model` = '%d', `X` = '%f', `Y` = '%f', `Z` = '%f', `Angle` = '%f', `Interior` = '%d', `VirtualWorld` = '%d' WHERE `ID` = %d", oInfo[i][O_MODEL], oInfo[i][O_X], oInfo[i][O_Y], oInfo[i][O_Z], oInfo[i][O_A], oInfo[i][O_INT], oInfo[i][O_VW], ID);
204 mysql_tquery(ObjectsDB, szQuery,"","");
205 ID++;
206 }
207 }
208 printf("%d Dynamic Objects saved in %dms.", objcount, GetTickCount()-time);
209 return 1;
210}
211
212forward LoadDynamicObjects();
213public LoadDynamicObjects()
214{
215 new time = GetTickCount();
216 new rows;
217 cache_get_row_count(rows);
218 if(rows)
219 {
220 new i = 0;
221 while(i < rows)
222 {
223 cache_get_value_name_int(i, "Model", oInfo[i][O_MODEL]);
224 cache_get_value_name_float(i, "X", oInfo[i][O_X]);
225 cache_get_value_name_float(i, "Y", oInfo[i][O_Y]);
226 cache_get_value_name_float(i, "Z", oInfo[i][O_Z]);
227 cache_get_value_name_float(i, "Angle", oInfo[i][O_A]);
228 cache_get_value_name_int(i, "Interior", oInfo[i][O_INT]);
229 cache_get_value_name_int(i, "VirtualWorld", oInfo[i][O_VW]);
230 new TEXTLABEL[16];
231 format(TEXTLABEL, sizeof(TEXTLABEL), "Object\nID: %d", i);
232 oInfo[i][O_TEXTID] = CreateDynamic3DTextLabel(TEXTLABEL, 0x1D9F00AA, oInfo[i][O_X], oInfo[i][O_Y], oInfo[i][O_Z]+1.5, 5.0, _, _, _, oInfo[i][O_VW], oInfo[i][O_INT], _, _);
233 oInfo[i][O_ID] = CreateDynamicObject(oInfo[i][O_MODEL], oInfo[i][O_X], oInfo[i][O_Y], oInfo[i][O_Z], 0.0, 0.0, oInfo[i][O_A], oInfo[i][O_VW], oInfo[i][O_INT], _, _);
234 gObjCount++;
235 i++;
236 }
237 printf("%d Dynamic Objects loaded in %dms.", rows, GetTickCount()-time);
238 }
239 return 1;
240}