func.pwn 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. LoadModelCache() {
  2. g_ModelCacheLimit = 0;
  3. g_DBResult = db_query(g_ResourceDB, "SELECT * FROM model_data");
  4. for(new row, rows = db_num_rows(g_DBResult), modelid; row < rows; row ++) {
  5. if( g_ModelCacheLimit < MAX_MODELS ) {
  6. modelid = db_get_field_assoc_int(g_DBResult, "modelid");
  7. if( modelid >= MIN_MODEL_ID && modelid <= MAX_MODEL_ID ) {
  8. g_ModelCacheIndex[ modelid - MIN_MODEL_ID ] = g_ModelCacheLimit;
  9. }
  10. g_ModelCache[g_ModelCacheLimit][MODEL_CACHE_ID] = modelid;
  11. g_ModelCache[g_ModelCacheLimit][MODEL_CACHE_SPHERE_RADIUS] = db_get_field_assoc_float(g_DBResult, "sphere_radius");
  12. g_ModelCache[g_ModelCacheLimit][MODEL_CACHE_SPHERE_OFF_X] = db_get_field_assoc_float(g_DBResult, "sphere_off_x");
  13. g_ModelCache[g_ModelCacheLimit][MODEL_CACHE_SPHERE_OFF_Y] = db_get_field_assoc_float(g_DBResult, "sphere_off_y");
  14. g_ModelCache[g_ModelCacheLimit][MODEL_CACHE_SPHERE_OFF_Z] = db_get_field_assoc_float(g_DBResult, "sphere_off_z");
  15. g_ModelCache[g_ModelCacheLimit][MODEL_CACHE_MIN_X] = db_get_field_assoc_float(g_DBResult, "min_x");
  16. g_ModelCache[g_ModelCacheLimit][MODEL_CACHE_MIN_Y] = db_get_field_assoc_float(g_DBResult, "min_y");
  17. g_ModelCache[g_ModelCacheLimit][MODEL_CACHE_MIN_Z] = db_get_field_assoc_float(g_DBResult, "min_z");
  18. g_ModelCache[g_ModelCacheLimit][MODEL_CACHE_MAX_X] = db_get_field_assoc_float(g_DBResult, "max_x");
  19. g_ModelCache[g_ModelCacheLimit][MODEL_CACHE_MAX_Y] = db_get_field_assoc_float(g_DBResult, "max_y");
  20. g_ModelCache[g_ModelCacheLimit][MODEL_CACHE_MAX_Z] = db_get_field_assoc_float(g_DBResult, "max_z");
  21. db_get_field_assoc(g_DBResult, "name", g_ModelString, sizeof g_ModelString);
  22. strpack( g_ModelCache[g_ModelCacheLimit][MODEL_CACHE_NAME], g_ModelString, MAX_MODELNAME_LEN+1);
  23. }
  24. g_ModelCacheLimit ++;
  25. db_next_row(g_DBResult);
  26. }
  27. db_free_result(g_DBResult);
  28. }
  29. FindModels(result[], result_size, search[], categoryid, offset, &max_offset) {
  30. new added_rows;
  31. if( categoryid == INVALID_CATEGORY_ID ) {
  32. if( isempty(search) ) {
  33. for(new i = offset; i < g_ModelCacheLimit; i ++) {
  34. if( added_rows >= result_size ) {
  35. break;
  36. }
  37. result[added_rows ++] = g_ModelCache[i][MODEL_CACHE_ID];
  38. }
  39. max_offset = g_ModelCacheLimit - 1;
  40. return added_rows;
  41. } else {
  42. format(g_QueryString, sizeof g_QueryString, "\
  43. SELECT modelid, \
  44. (SELECT COUNT(*) FROM model_data WHERE modelid LIKE '%%%q%%' OR name LIKE '%%%q%%') AS max_rowcount \
  45. FROM model_data \
  46. WHERE modelid LIKE '%%%q%%' OR name LIKE '%%%q%%' \
  47. LIMIT %i OFFSET %i",
  48. search, search,
  49. search, search,
  50. result_size, offset
  51. );
  52. }
  53. } else {
  54. if( isempty(search) ) {
  55. format(g_QueryString, sizeof g_QueryString, "\
  56. SELECT modelid, \
  57. (SELECT COUNT(*) FROM model_category_bind WHERE categoryid = '%i') AS max_rowcount \
  58. FROM model_category_bind \
  59. WHERE categoryid = '%i' \
  60. LIMIT %i OFFSET %i",
  61. categoryid,
  62. categoryid,
  63. result_size, offset
  64. );
  65. } else {
  66. format(g_QueryString, sizeof g_QueryString, "\
  67. SELECT b.modelid AS modelid, \
  68. (\
  69. SELECT COUNT(*) \
  70. FROM model_category_bind b \
  71. INNER JOIN model_data d ON b.modelid = d.modelid \
  72. WHERE b.categoryid = '%i' AND (d.modelid LIKE '%%%q%%' OR d.name LIKE '%%%q%%')\
  73. ) AS max_rowcount \
  74. FROM model_category_bind b \
  75. INNER JOIN model_data d ON b.modelid = d.modelid \
  76. WHERE b.categoryid = '%i' AND (d.modelid LIKE '%%%q%%' OR d.name LIKE '%%%q%%') \
  77. LIMIT %i OFFSET %i",
  78. categoryid, search, search,
  79. categoryid, search, search,
  80. result_size, offset
  81. );
  82. }
  83. }
  84. g_DBResult = db_query(g_ResourceDB, g_QueryString);
  85. new result_rows = db_num_rows(g_DBResult);
  86. if( result_rows > 0 ) {
  87. max_offset = db_get_field_assoc_int(g_DBResult, "max_rowcount") - 1;
  88. if( max_offset < 0 ) {
  89. max_offset = 0;
  90. }
  91. }
  92. for(new row; row < result_rows; row ++) {
  93. if( added_rows >= result_size ) {
  94. break;
  95. }
  96. result[added_rows ++] = db_get_field_assoc_int(g_DBResult, "modelid");
  97. db_next_row(g_DBResult);
  98. }
  99. db_free_result(g_DBResult);
  100. return added_rows;
  101. }
  102. GetModelCacheIndex(modelid) {
  103. if( modelid >= MIN_MODEL_ID && modelid <= MAX_MODEL_ID ) {
  104. new cache_index = g_ModelCacheIndex[modelid - MIN_MODEL_ID];
  105. if( g_ModelCache[cache_index][MODEL_CACHE_ID] == modelid ) {
  106. return cache_index;
  107. }
  108. }
  109. return INVALID_ARRAY_INDEX;
  110. }
  111. GetModelName(modelid, name[], name_size) {
  112. new cache_index = GetModelCacheIndex(modelid);
  113. if( cache_index == INVALID_ARRAY_INDEX ) {
  114. return format(name, name_size, "Unknown Model"), 0;
  115. }
  116. return strunpack(name, g_ModelCache[cache_index][MODEL_CACHE_NAME], name_size), 1;
  117. }
  118. stock GetModelSphere(modelid, &Float:radius, &Float:off_x, &Float:off_y, &Float:off_z) {
  119. new cache_index = GetModelCacheIndex(modelid);
  120. if( cache_index == INVALID_ARRAY_INDEX ) {
  121. return 0;
  122. }
  123. radius = g_ModelCache[cache_index][MODEL_CACHE_SPHERE_RADIUS];
  124. off_x = g_ModelCache[cache_index][MODEL_CACHE_SPHERE_OFF_X];
  125. off_y = g_ModelCache[cache_index][MODEL_CACHE_SPHERE_OFF_Y];
  126. off_z = g_ModelCache[cache_index][MODEL_CACHE_SPHERE_OFF_Z];
  127. return 1;
  128. }
  129. stock GetModelMinMaxXYZ(modelid, &Float:min_x, &Float:min_y, &Float:min_z, &Float:max_x, &Float:max_y, &Float:max_z) {
  130. new cache_index = GetModelCacheIndex(modelid);
  131. if( cache_index == INVALID_ARRAY_INDEX ) {
  132. return 0;
  133. }
  134. min_x = g_ModelCache[cache_index][MODEL_CACHE_MIN_X];
  135. min_y = g_ModelCache[cache_index][MODEL_CACHE_MIN_Y];
  136. min_z = g_ModelCache[cache_index][MODEL_CACHE_MIN_Z];
  137. max_x = g_ModelCache[cache_index][MODEL_CACHE_MAX_X];
  138. max_y = g_ModelCache[cache_index][MODEL_CACHE_MAX_Y];
  139. max_z = g_ModelCache[cache_index][MODEL_CACHE_MAX_Z];
  140. return 1;
  141. }
  142. stock GetModelMinX(modelid, &Float:min) {
  143. new cache_index = GetModelCacheIndex(modelid);
  144. if( cache_index == INVALID_ARRAY_INDEX ) {
  145. return 0;
  146. }
  147. min = g_ModelCache[cache_index][MODEL_CACHE_MIN_X];
  148. return 1;
  149. }
  150. stock GetModelMinY(modelid, &Float:min) {
  151. new cache_index = GetModelCacheIndex(modelid);
  152. if( cache_index == INVALID_ARRAY_INDEX ) {
  153. return 0;
  154. }
  155. min = g_ModelCache[cache_index][MODEL_CACHE_MIN_Y];
  156. return 1;
  157. }
  158. stock GetModelMinZ(modelid, &Float:min) {
  159. new cache_index = GetModelCacheIndex(modelid);
  160. if( cache_index == INVALID_ARRAY_INDEX ) {
  161. return 0;
  162. }
  163. min = g_ModelCache[cache_index][MODEL_CACHE_MIN_Z];
  164. return 1;
  165. }
  166. stock GetModelMaxX(modelid, &Float:max) {
  167. new cache_index = GetModelCacheIndex(modelid);
  168. if( cache_index == INVALID_ARRAY_INDEX ) {
  169. return 0;
  170. }
  171. max = g_ModelCache[cache_index][MODEL_CACHE_MAX_X];
  172. return 1;
  173. }
  174. stock GetModelMaxY(modelid, &Float:max) {
  175. new cache_index = GetModelCacheIndex(modelid);
  176. if( cache_index == INVALID_ARRAY_INDEX ) {
  177. return 0;
  178. }
  179. max = g_ModelCache[cache_index][MODEL_CACHE_MAX_Y];
  180. return 1;
  181. }
  182. stock GetModelMaxZ(modelid, &Float:max) {
  183. new cache_index = GetModelCacheIndex(modelid);
  184. if( cache_index == INVALID_ARRAY_INDEX ) {
  185. return 0;
  186. }
  187. max = g_ModelCache[cache_index][MODEL_CACHE_MAX_Z];
  188. return 1;
  189. }