Advertisement
Guest User

Sim

a guest
Dec 6th, 2009
271
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.05 KB | None | 0 0
  1. #include <a_samp>
  2.  
  3. /*
  4.  
  5. Features pr�vues:
  6.  
  7. ~~ - revoir logique de streaming..(s�lectionner une partie des objets, faire quelques stream avec, puis quand sont outdated on change la s�lection, v�rifier d�placements via OnPlayerUpdate)
  8. - ajouter une variable qui pointe l'objet avec l'ID le plus haut
  9.  
  10. */
  11.  
  12. //CONSTANT DECLARATION
  13.  
  14. #undef MAX_PLAYERS
  15. #define MAX_PLAYERS 100
  16.  
  17. //#define NO_TICK_COUNT //si jamais un probl�me est rencontr� avec la fonction GetTickCount(), vous n'avez qu'a d�commenter cette ligne et recompiler
  18.  
  19. #define TIME_GRANULITY (50) //pr�cision du syst�me de mesure du temps (permet de compenser GetTickCount() sous linux)
  20. #define MOVEMENT_UPDATE (100) //temps entre deux mises � jour de la positions des objets qui bougent
  21. #define STREAMING_DELAY (750) //temps minimal (en ms) depuis le dernier streaming pour ex�cuter le streaming via le timer
  22. #define TIME_STREAMING (1000) //cette valeur doit TOUJOURS �tre sup�rieur � celle au-dessus (STREAMING_DELAY), temps du timer pour le streaming
  23.  
  24. #define VIEWED_OBJECTS (175)
  25.  
  26. #define MAX_STREAM_OBJECTS (25000)
  27.  
  28. #define MAX_STREAM_DISTANCE (350) //distance � partir de laquelle on force un streaming (pour compenser le d�placement depuis le dernier streaming)
  29.  
  30. //CONSTANT USING FUNCTIONS DECLARATION
  31.  
  32. #define PointToPoint(%0,%1,%2,%3,%4,%5,%6) (((%0 - %3) * (%0 - %3) + (%1 - %4) * (%1 - %4) + (%2 - %5) * (%2 - %5)) <= (%6 * %6))
  33. #define GetSquaredDistance(%0,%1,%2,%3,%4,%5) ((%0 - %3) * (%0 - %3) + (%1 - %4) * (%1 - %4) + (%2 - %5) * (%2 - %5))
  34.  
  35. #if defined NO_TICK_COUNT
  36. #define GetTickCount() (CurrentTick)
  37. #endif
  38.  
  39. #define LastStreamPosUpdate(%0,%1,%2,%3,%4) LastStreamPos[%0][0] = %1;\
  40. LastStreamPos[%0][1] = %2;\
  41. LastStreamPos[%0][2] = %3;\
  42. LastStreamPos[%0][3] = %4
  43.  
  44. #define IsValid(%0) (%0 < MAX_STREAM_OBJECTS && ObjectModel[%0])
  45.  
  46. #define MAJOR_VERSION 1
  47. #define MINOR_VERSION 1
  48. #define BUG_FIX 2
  49.  
  50.  
  51. //OBJECT RELATED VARIABLES
  52.  
  53. new ObjectModel[MAX_STREAM_OBJECTS];
  54.  
  55. new Float:ObjectPosX[MAX_STREAM_OBJECTS];
  56. new Float:ObjectPosY[MAX_STREAM_OBJECTS];
  57. new Float:ObjectPosZ[MAX_STREAM_OBJECTS];
  58.  
  59. new Float:ObjectPosRX[MAX_STREAM_OBJECTS];
  60. new Float:ObjectPosRY[MAX_STREAM_OBJECTS];
  61. new Float:ObjectPosRZ[MAX_STREAM_OBJECTS];
  62.  
  63. new Float:ObjectSpeed[MAX_STREAM_OBJECTS];
  64. new Float:ObjectEndX[MAX_STREAM_OBJECTS];
  65. new Float:ObjectEndY[MAX_STREAM_OBJECTS];
  66. new Float:ObjectEndZ[MAX_STREAM_OBJECTS];
  67.  
  68. new CurrentMinID = 0;
  69.  
  70. //PLAYER RELATED VARIABLES
  71.  
  72. new Spawned[MAX_PLAYERS];
  73. new LastStreamTime[MAX_PLAYERS];
  74. new Float:LastStreamPos[MAX_PLAYERS][4];
  75. new StreamedObjectsID[MAX_PLAYERS][MAX_STREAM_OBJECTS];
  76.  
  77. // STREAM RELATED VARIABLES
  78.  
  79. new MaximumID = 0;
  80. new Float:ObjectDist[750];//on stock les distances ici
  81. new ObjectID[750];//on stock les ID ici
  82.  
  83. //TIMER/CORE variables
  84. new core_Timer;
  85. new Move_Timer;
  86. #if defined NO_TICK_COUNT
  87. new CurrentTick = 0;
  88. #endif
  89.  
  90.  
  91. //FORWARDS
  92.  
  93. forward TimeUpdate();
  94. forward MoveObjects();
  95. forward core_Stream();
  96. forward StreamPlayer(playerid, Float:PX, Float:PY, Float:PZ);
  97. forward core_CreateObject(model, Float:OX, Float:OY, Float:OZ, Float:ORX, Float:ORY, Float:ORZ);
  98. forward core_DestroyObject(objectid);
  99. forward core_ClearPlayerObjects(playerid);
  100. forward core_ClearAllObjects();
  101. forward core_MoveObject(objectid, Float:TargetX, Float:TargetY, Float:TargetZ, Float:Speed);
  102. forward core_StopObject(objectid);
  103.  
  104. public OnFilterScriptInit()
  105. {
  106. print("|==========================================|");
  107. print("| Loading SuperStream by Sim V" #MAJOR_VERSION "." #MINOR_VERSION "." #BUG_FIX "... |");
  108. print("|==========================================|\n");
  109. #if defined NO_TICK_COUNT
  110. SetTimer("TimeUpdate", TIME_GRANULITY, true);
  111. #endif
  112. core_Timer = SetTimer("core_Stream", TIME_STREAMING, true);
  113. Move_Timer = SetTimer("MoveObjects", MOVEMENT_UPDATE, true);
  114. print("|==========================================|");
  115. print("| SuperStream V" #MAJOR_VERSION "." #MINOR_VERSION "." #BUG_FIX " loaded! |");
  116. print("|==========================================|");
  117. return 1;
  118. }
  119.  
  120. public OnFilterScriptExit()
  121. {
  122. print("|==========================================|");
  123. print("| Unloading SuperStream by Sim V" #MAJOR_VERSION "." #MINOR_VERSION "." #BUG_FIX "... |");
  124. print("|==========================================|\n");
  125. KillTimer(core_Timer);
  126. KillTimer(Move_Timer);
  127. for( new i = 0; i < MAX_PLAYERS; i++)
  128. {
  129. core_ClearPlayerObjects(i);
  130. }
  131. core_ClearAllObjects();
  132. print("|==========================================|");
  133. print("| SuperStream V" #MAJOR_VERSION "." #MINOR_VERSION "." #BUG_FIX " unloaded! |");
  134. print("|==========================================|");
  135. return 1;
  136. }
  137.  
  138. public OnPlayerConnect(playerid)
  139. {
  140. for(new i = 0; i < MAX_STREAM_OBJECTS; i++)
  141. {
  142. StreamedObjectsID[playerid][i] = INVALID_OBJECT_ID;
  143. }
  144. LastStreamTime[playerid] = GetTickCount();
  145. Spawned[playerid] = false;
  146. return 1;
  147. }
  148.  
  149. public OnPlayerDisconnect(playerid)
  150. {
  151. core_ClearPlayerObjects(playerid);
  152. Spawned[playerid] = false;
  153. return 1;
  154. }
  155.  
  156. public OnPlayerRequestClass(playerid, classid)
  157. {
  158. if(classid == 0)//le premier coup que le joueur arrive au choix
  159. {
  160. Spawned[playerid] = true;
  161. }
  162. else
  163. {
  164. Spawned[playerid] = false;
  165. }
  166. return 1;
  167. }
  168.  
  169. public OnPlayerSpawn(playerid)
  170. {
  171. Spawned[playerid] = true;
  172. return 1;
  173. }
  174.  
  175. public OnPlayerDeath(playerid, killerid, reason)
  176. {
  177. Spawned[playerid] = false;
  178. return 1;
  179. }
  180.  
  181. public OnPlayerUpdate(playerid)
  182. {
  183. if(Spawned[playerid])
  184. {
  185. new Float:X, Float:Y, Float:Z;
  186. GetPlayerPos(playerid, X, Y, Z);
  187. if(!PointToPoint(X, Y, Z, LastStreamPos[playerid][0], LastStreamPos[playerid][1], LastStreamPos[playerid][2], LastStreamPos[playerid][3]))
  188. {
  189. StreamPlayer(playerid, X, Y, Z);
  190. }
  191. }
  192. return 1;
  193. }
  194.  
  195. #if defined NO_TICK_COUNT
  196.  
  197. public TimeUpdate()
  198. {
  199. CurrentTick +=TIME_GRANULITY;
  200. return 1;
  201. }
  202.  
  203. #endif
  204.  
  205. public MoveObjects()
  206. {
  207.  
  208. #define Fraction() (MOVEMENT_UPDATE/1000)
  209.  
  210. new i = 0;
  211. new Float:dx, Float:dy, Float:dz, Float:dp;
  212. for( i = 0; i < MAX_STREAM_OBJECTS; i++)
  213. {
  214. if(ObjectSpeed[i])
  215. {
  216. dx = ObjectEndX[i] - ObjectPosX[i];
  217. dy = ObjectEndY[i] - ObjectPosY[i];
  218. dz = ObjectEndZ[i] - ObjectPosZ[i];
  219. dp = floatsqroot(dx * dx + dy * dy + dz * dz);
  220. if(dp <= ObjectSpeed[i] * Fraction())
  221. {
  222. ObjectPosX[i] += dx;
  223. ObjectPosX[i] += dy;
  224. ObjectPosX[i] += dz;
  225. ObjectSpeed[i] = 0;
  226. CallRemoteFunction("OnStreamObjectMoved", "i", i);
  227. }
  228. else
  229. {
  230. ObjectPosX[i] += ObjectSpeed[i] * Fraction() * (dx/dp);
  231. ObjectPosY[i] += ObjectSpeed[i] * Fraction() * (dy/dp);
  232. ObjectPosZ[i] += ObjectSpeed[i] * Fraction() * (dz/dp);
  233. }
  234. }
  235. }
  236. return 1;
  237. }
  238.  
  239. public core_Stream()
  240. {
  241. new Float:X, Float:Y, Float:Z;
  242. for(new i = 0; i < MAX_PLAYERS; i++)
  243. {
  244. if(Spawned[i])
  245. {
  246. if(GetPlayerPos(i, X, Y, Z))
  247. {
  248. if(X == 0.0 && Y == 0.0 && Z == 0.0)
  249. {
  250. }
  251. else if((GetTickCount() - LastStreamTime[i]) >= STREAMING_DELAY)
  252. {
  253. StreamPlayer(i, X, Y, Z);
  254. }
  255. }
  256. }
  257. }
  258. return 1;
  259. }
  260.  
  261. public StreamPlayer(playerid, Float:PX, Float:PY, Float:PZ)
  262. {
  263. new object, i;
  264. for(i = 0; i <= MaximumID; i++)
  265. {
  266. if(ObjectModel[i])
  267. {
  268. ObjectDist[object] = GetSquaredDistance(PX, PY, PZ, ObjectPosX[i], ObjectPosY[i], ObjectPosZ[i]);
  269. if(ObjectDist[object] <= MAX_STREAM_DISTANCE * MAX_STREAM_DISTANCE)
  270. {
  271. ObjectID[object] = i;
  272. object++;
  273. }
  274. else
  275. {
  276. if(StreamedObjectsID[playerid][i] != INVALID_OBJECT_ID)
  277. {
  278. DestroyStreamedObject(playerid, i);
  279. }
  280. }
  281. }
  282. }
  283. object--;
  284. QSort(ObjectDist, 0, object, ObjectID);//v�rifier pour object-1
  285.  
  286. while(object >= VIEWED_OBJECTS)//tant que les objets sont trop loin
  287. {
  288. i = ObjectID[object];//on r�cup�re l'objet
  289. if(StreamedObjectsID[playerid][i] != INVALID_OBJECT_ID)//on teste s'il est montr�
  290. {
  291. DestroyStreamedObject(playerid, i);//on d�truit l'objet
  292. }
  293. object--;
  294. }
  295. new tmp = object;
  296. while(tmp >= 0)//tant que les objets sont trop loin
  297. {
  298. i = ObjectID[tmp];
  299. if(StreamedObjectsID[playerid][i] == INVALID_OBJECT_ID && ObjectModel[i])//on teste s'il est montr�
  300. {
  301. CreateStreamedObject(playerid, i);//on cr�e l'objet
  302. }
  303. tmp--;
  304. }
  305. LastStreamTime[playerid] = GetTickCount();
  306. LastStreamPosUpdate(playerid, PX, PY, PZ, floatsqroot(ObjectDist[tmp])/1.5);
  307. return 1;
  308. }
  309.  
  310. stock QSort(Float:numbers[], left, right, var2[])
  311. {
  312. new
  313. Float:var = numbers[left],
  314. pivot = var2[left],
  315. l_hold = left,
  316. r_hold = right;
  317. while (left < right)
  318. {
  319. while ((numbers[right] >= var) && (left < right)) right--;
  320. if (left != right)
  321. {
  322. numbers[left] = numbers[right];
  323. var2[left] = var2[right];
  324. left++;
  325. }
  326. while ((numbers[left] <= var) && (left < right)) left++;
  327. if (left != right)
  328. {
  329. numbers[right] = numbers[left];
  330. var2[right] = var2[left];
  331. right--;
  332. }
  333. }
  334. numbers[left] = var;
  335. var2[left] = pivot;
  336. pivot = left;
  337. if (l_hold < pivot) QSort(numbers, l_hold, pivot - 1, var2);
  338. if (r_hold > pivot) QSort(numbers, pivot + 1, r_hold, var2);
  339. }
  340.  
  341. CreateStreamedObject(playerid, objectid)
  342. {
  343. StreamedObjectsID[playerid][objectid] = CreatePlayerObject(playerid, ObjectModel[objectid], ObjectPosX[objectid], ObjectPosY[objectid], ObjectPosZ[objectid], ObjectPosRX[objectid], ObjectPosRY[objectid], ObjectPosRZ[objectid]);
  344. if(ObjectSpeed[objectid])
  345. {
  346. MovePlayerObject(playerid, StreamedObjectsID[playerid][objectid], ObjectEndX[objectid], ObjectEndY[objectid], ObjectEndZ[objectid], ObjectSpeed[objectid]);
  347. }
  348. return 1;
  349. }
  350.  
  351. DestroyStreamedObject(playerid, objectid)
  352. {
  353. DestroyPlayerObject(playerid, StreamedObjectsID[playerid][objectid]);
  354. StreamedObjectsID[playerid][objectid] = INVALID_OBJECT_ID;
  355. return 1;
  356. }
  357.  
  358. //FONCTIONS ACCESSIBLES DEPUIS L'INCLUDE
  359.  
  360. public core_CreateObject(model, Float:OX, Float:OY, Float:OZ, Float:ORX, Float:ORY, Float:ORZ)//valeur de retour: ID de l'objet cr��, -1 si invalide
  361. {
  362. if(CurrentMinID >= MAX_STREAM_OBJECTS)
  363. {
  364. printf("Can't create object (%d, %f, %f, %f, %f, %f, %f), limit reached!", model, OX, OY, OZ, ORX, ORY, ORZ);
  365. return -1;//ne peut cr�er l'objet, plein
  366. }
  367. if(model <= 0)
  368. {
  369. printf("Can't create object (%d, %f, %f, %f, %f, %f, %f), model invalid!", model, OX, OY, OZ, ORX, ORY, ORZ);
  370. return -1;//ne peut cr�er l'objet, plein
  371. }
  372. while(ObjectModel[CurrentMinID])
  373. {
  374. CurrentMinID++;
  375. if(CurrentMinID >= MAX_STREAM_OBJECTS)
  376. {
  377. printf("Can't create object (%d, %f, %f, %f, %f, %f, %f), limit reached!", model, OX, OY, OZ, ORX, ORY, ORZ);
  378. return -1;//ne peut cr�er l'objet, plein
  379. }
  380. }
  381. if(MaximumID < CurrentMinID)
  382. {
  383. MaximumID = CurrentMinID;
  384. }
  385. ObjectModel[CurrentMinID] = model;
  386. ObjectPosX[CurrentMinID] = OX;
  387. ObjectPosY[CurrentMinID] = OY;
  388. ObjectPosZ[CurrentMinID] = OZ;
  389. ObjectPosRX[CurrentMinID] = ORX;
  390. ObjectPosRY[CurrentMinID] = ORY;
  391. ObjectPosRZ[CurrentMinID] = ORZ;
  392. ObjectSpeed[CurrentMinID] = 0;
  393. return CurrentMinID + 1;//retour de l'ID(s'assure que les id des objets retourn�es != 0)
  394. }
  395.  
  396. public core_DestroyObject(objectid)//valeur de retour: ID de l'objet cr��, -1 si invalide
  397. {
  398. objectid -= 1;//s'assure que les id des objets retourn�es != 0
  399. if(objectid >= MAX_STREAM_OBJECTS || objectid < 0)
  400. {
  401. printf("Can't delete object %d, array out of bounds!", objectid + 1);
  402. return 0;//ne peut cr�er l'objet, plein
  403. }
  404. if(ObjectModel[objectid])
  405. {
  406. ObjectModel[objectid] = 0;
  407. ObjectPosX[objectid] = 0;
  408. ObjectPosY[objectid] = 0;
  409. ObjectPosZ[objectid] = 0;
  410. ObjectPosRX[objectid] = 0;
  411. ObjectPosRY[objectid] = 0;
  412. ObjectPosRZ[objectid] = 0;
  413. ObjectSpeed[objectid] = 0;
  414. for(new i = 0; i < MAX_PLAYERS; i++)
  415. {
  416. DestroyStreamedObject(i, objectid);
  417. }
  418. }
  419. else
  420. {
  421. printf("Can't delete object %d, it doesn't exist!", objectid + 1);
  422. return 0;
  423. }
  424. if(CurrentMinID > objectid)
  425. {
  426. CurrentMinID = objectid;
  427. }
  428. if(MaximumID == objectid)
  429. {
  430. while(ObjectModel[MaximumID] == 0)
  431. {
  432. MaximumID--;
  433. }
  434. }
  435. return 1;//retour de l'ID
  436. }
  437.  
  438. public core_ClearPlayerObjects(playerid)
  439. {
  440. for( new i = 0; i < MAX_STREAM_OBJECTS; i++)
  441. {
  442. if(StreamedObjectsID[playerid][i])
  443. {
  444. DestroyStreamedObject(playerid, i);
  445. }
  446. }
  447. return 1;
  448. }
  449.  
  450. public core_ClearAllObjects()
  451. {
  452. for( new i = 1; i <= MAX_STREAM_OBJECTS; i++)
  453. {
  454. if(ObjectModel[i])
  455. {
  456. core_DestroyObject(i);
  457. }
  458. }
  459. return 1;
  460. }
  461.  
  462.  
  463.  
  464. public core_MoveObject(objectid, Float:TargetX, Float:TargetY, Float:TargetZ, Float:Speed)//valeur de retour: 0 si objet invalide, 1 si objet en mouvement
  465. {
  466. new id = 0;
  467. objectid -= 1;//s'assure que les id des objets retourn�es != 0
  468. if(IsValid(objectid))
  469. {
  470. ObjectEndX[objectid] = TargetX;
  471. ObjectEndY[objectid] = TargetY;
  472. ObjectEndZ[objectid] = TargetZ;
  473.  
  474. ObjectSpeed[objectid] = Speed;
  475.  
  476. for(new i = 0; i < MAX_PLAYERS; i++)
  477. {
  478. if((id = StreamedObjectsID[i][objectid]))
  479. {
  480. MovePlayerObject(i, id, TargetX, TargetY, TargetZ, Speed);
  481. }
  482. }
  483. id = 1;
  484. }
  485. return id;
  486. }
  487.  
  488. public core_StopObject(objectid)//valeur de retour: 1 si r�ussit, 0 si impossible
  489. {
  490. new id = 0;
  491. objectid -= 1;//s'assure que les id des objets retourn�es != 0
  492. if(IsValid(objectid))
  493. {
  494. if(ObjectSpeed[objectid])
  495. {
  496. //on s'assure de stopper les calculs par la fonction MoveObjects
  497. ObjectSpeed[objectid] = 0;
  498.  
  499. //On stop l'objet pour tous les joueurs
  500. for(new i = 0; i < MAX_PLAYERS; i++)
  501. {
  502. if((id = StreamedObjectsID[i][objectid]))
  503. {
  504. StopPlayerObject(i, id);
  505. }
  506. }
  507. id = 1;
  508. }
  509. }
  510. return id;
  511. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement