SOI.inc 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305
  1. /**********************************************************************************************************************************
  2. * *
  3. * )( Skin Offset Image )( *
  4. * *
  5. * Copyright © 2017 Abyss Morgan. All rights reserved. *
  6. * *
  7. * Download: https://github.com/AbyssMorgan/SA-MP/tree/master/include/SAM *
  8. * Publication: None *
  9. * Website: http://8.ct8.pl *
  10. * *
  11. * Plugins: None *
  12. * Modules: None *
  13. * *
  14. * File Version: 1.0.0 *
  15. * SA:MP Version: 0.3.7 *
  16. * *
  17. * Notice: *
  18. * Required directory /scriptfiles/SOI *
  19. * *
  20. * Options: *
  21. * DISABLE_SOI_CACHE - Disable Cache Functions *
  22. * *
  23. * Functions: *
  24. * SOI::GetSkinOffset(modelid,skinid,&bone,&Float:x,&Float:y,&Float:z,&Float:rx=0.0,&Float:ry=0.0,&Float:rz=0.0, *
  25. * &Float:sx=0.0,&Float:sy=0.0,&Float:sz=0.0); *
  26. * *
  27. * Cache Functions: *
  28. * SOI::GetDefaultSkinOffset(&bone,&Float:x,&Float:y,&Float:z,&Float:rx=0.0,&Float:ry=0.0,&Float:rz=0.0, *
  29. * &Float:sx=0.0,&Float:sy=0.0,&Float:sz=0.0); *
  30. * SOI::SetDefaultSkinOffset(bone,Float:x,Float:y,Float:z,Float:rx=0.0,Float:ry=0.0,Float:rz=0.0, *
  31. * Float:sx=1.0,Float:sy=1.0,Float:sz=1.0); *
  32. * SOI::GetTempSkinOffset(skinid,&bone,&Float:x,&Float:y,&Float:z,&Float:rx=0.0,&Float:ry=0.0,&Float:rz=0.0, *
  33. * &Float:sx=1.0,&Float:sy=1.0,&Float:sz=1.0); *
  34. * SOI::SetTempSkinOffset(skinid,bone,Float:x,Float:y,Float:z,Float:rx=0.0,Float:ry=0.0,Float:rz=0.0, *
  35. * Float:sx=1.0,Float:sy=1.0,Float:sz=1.0); *
  36. * SOI::LoadTempData(modelid); *
  37. * SOI::DumpTempData(); *
  38. * *
  39. **********************************************************************************************************************************/
  40. /*
  41. //Check Version SOI.inc
  42. #if !defined _SOI_FILES
  43. #error You need SOI.inc v1.0.0
  44. #elseif !defined SOI_FILES_VERSION
  45. #error Update you SOI.inc to v1.0.0
  46. #elseif (SOI_FILES_VERSION < 10000)
  47. #error Update you SOI.inc to v1.0.0
  48. #endif
  49. */
  50. #if defined _SOI_FILES
  51. #endinput
  52. #endif
  53. #define _SOI_FILES
  54. #define SOI_FILES_VERSION (10000) //a.b[c] 10000*a+100*b+c
  55. #define SOI_HEADER_KEY "SOI 1.0 ADM" //You can never change !!!
  56. #define MAX_SKINS (312)
  57. #define SOI_FILE_SIZE (11555)
  58. #define SOI_Function:: stock
  59. #define SOI_Public::%0(%1) forward %0(%1); public %0(%1)
  60. #define SOI:: SOI_
  61. //BitFunctions.inc
  62. #define SOI_ExtractValue(%0,%1,%2,%3,%4) ((%1) = (((%0) & 0xFF000000) >>> 24),(%2) = (((%0) & 0x00FF0000) >>> 16),(%3) = (((%0) & 0x0000FF00) >>> 8),(%4) = ((%0) & 0x000000FF))
  63. #define SOI_ExtractFloat(%0,%1,%2,%3,%4) ((%1) = (((_:%0) & 0xFF000000) >>> 24),(%2) = (((_:%0) & 0x00FF0000) >>> 16),(%3) = (((_:%0) & 0x0000FF00) >>> 8),(%4) = ((_:%0) & 0x000000FF))
  64. #define SOI_MergeValue(%0,%1,%2,%3,%4) ((%0) = (((%1) << 24) | ((%2) << 16) | ((%3) << 8) | (%4)))
  65. #define SOI_MergeFloat(%0,%1,%2,%3,%4) ((%0) = Float:(((%1) << 24) | ((%2) << 16) | ((%3) << 8) | (%4)))
  66. #if !defined DISABLE_SOI_CACHE
  67. enum SOI::SkinsTemp {
  68. bool:SOI::set,
  69. SOI::bone,
  70. Float:SOI::x,
  71. Float:SOI::y,
  72. Float:SOI::z,
  73. Float:SOI::rx,
  74. Float:SOI::ry,
  75. Float:SOI::rz,
  76. Float:SOI::sx,
  77. Float:SOI::sy,
  78. Float:SOI::sz
  79. };
  80. enum SOI::TempFile {
  81. bool:SOI::active,
  82. SOI::modelid
  83. };
  84. static SOI::TempSkinsData[MAX_SKINS][SOI::SkinsTemp],
  85. SOI::DefaultValues[SOI::SkinsTemp],
  86. SOI::TempFileData[SOI::TempFile];
  87. SOI::Function:: SOI::GetDefaultSkinOffset(&bone,&Float:x,&Float:y,&Float:z,&Float:rx=0.0,&Float:ry=0.0,&Float:rz=0.0,&Float:sx=0.0,&Float:sy=0.0,&Float:sz=0.0){
  88. if(!SOI::TempFileData[SOI::active]) return 0;
  89. bone = SOI::DefaultValues[SOI::bone];
  90. x = SOI::DefaultValues[SOI::x];
  91. y = SOI::DefaultValues[SOI::y];
  92. z = SOI::DefaultValues[SOI::z];
  93. rx = SOI::DefaultValues[SOI::rx];
  94. ry = SOI::DefaultValues[SOI::ry];
  95. rz = SOI::DefaultValues[SOI::rz];
  96. sx = SOI::DefaultValues[SOI::sx];
  97. sy = SOI::DefaultValues[SOI::sy];
  98. sz = SOI::DefaultValues[SOI::sz];
  99. return 1;
  100. }
  101. SOI::Function:: SOI::SetDefaultSkinOffset(bone,Float:x,Float:y,Float:z,Float:rx=0.0,Float:ry=0.0,Float:rz=0.0,Float:sx=1.0,Float:sy=1.0,Float:sz=1.0){
  102. if(!SOI::TempFileData[SOI::active]) return 0;
  103. SOI::DefaultValues[SOI::bone] = bone;
  104. SOI::DefaultValues[SOI::x] = x;
  105. SOI::DefaultValues[SOI::y] = y;
  106. SOI::DefaultValues[SOI::z] = z;
  107. SOI::DefaultValues[SOI::rx] = rx;
  108. SOI::DefaultValues[SOI::ry] = ry;
  109. SOI::DefaultValues[SOI::rz] = rz;
  110. SOI::DefaultValues[SOI::sx] = sx;
  111. SOI::DefaultValues[SOI::sy] = sy;
  112. SOI::DefaultValues[SOI::sz] = sz;
  113. return 1;
  114. }
  115. SOI::Function:: SOI::GetTempSkinOffset(skinid,&bone,&Float:x,&Float:y,&Float:z,&Float:rx=0.0,&Float:ry=0.0,&Float:rz=0.0,&Float:sx=1.0,&Float:sy=1.0,&Float:sz=1.0){
  116. if(!SOI::TempFileData[SOI::active]) return 0;
  117. if(skinid < 0 || skinid >= MAX_SKINS) return 0;
  118. bone = SOI::TempSkinsData[skinid][SOI::bone];
  119. x = SOI::TempSkinsData[skinid][SOI::x];
  120. y = SOI::TempSkinsData[skinid][SOI::y];
  121. z = SOI::TempSkinsData[skinid][SOI::z];
  122. rx = SOI::TempSkinsData[skinid][SOI::rx];
  123. ry = SOI::TempSkinsData[skinid][SOI::ry];
  124. rz = SOI::TempSkinsData[skinid][SOI::rz];
  125. sx = SOI::TempSkinsData[skinid][SOI::sx];
  126. sy = SOI::TempSkinsData[skinid][SOI::sy];
  127. sz = SOI::TempSkinsData[skinid][SOI::sz];
  128. return 1;
  129. }
  130. SOI::Function:: SOI::SetTempSkinOffset(skinid,bone,Float:x,Float:y,Float:z,Float:rx=0.0,Float:ry=0.0,Float:rz=0.0,Float:sx=1.0,Float:sy=1.0,Float:sz=1.0){
  131. if(!SOI::TempFileData[SOI::active]) return 0;
  132. if(skinid < 0 || skinid >= MAX_SKINS) return 0;
  133. SOI::TempSkinsData[skinid][SOI::set] = true;
  134. SOI::TempSkinsData[skinid][SOI::bone] = bone;
  135. SOI::TempSkinsData[skinid][SOI::x] = x;
  136. SOI::TempSkinsData[skinid][SOI::y] = y;
  137. SOI::TempSkinsData[skinid][SOI::z] = z;
  138. SOI::TempSkinsData[skinid][SOI::rx] = rx;
  139. SOI::TempSkinsData[skinid][SOI::ry] = ry;
  140. SOI::TempSkinsData[skinid][SOI::rz] = rz;
  141. SOI::TempSkinsData[skinid][SOI::sx] = sx;
  142. SOI::TempSkinsData[skinid][SOI::sy] = sy;
  143. SOI::TempSkinsData[skinid][SOI::sz] = sz;
  144. return 1;
  145. }
  146. SOI::Function:: SOI::LoadTempData(modelid){
  147. new file_name[64];
  148. format(file_name,sizeof(file_name),"/SOI/%d.soi",modelid);
  149. if(!fexist(file_name)){
  150. for(new skinid = 0; skinid < MAX_SKINS; skinid++){
  151. SOI::TempSkinsData[skinid][SOI::set] = false;
  152. SOI::TempSkinsData[skinid][SOI::bone] = 0;
  153. SOI::TempSkinsData[skinid][SOI::x] = 0.0;
  154. SOI::TempSkinsData[skinid][SOI::y] = 0.0;
  155. SOI::TempSkinsData[skinid][SOI::z] = 0.0;
  156. SOI::TempSkinsData[skinid][SOI::rx] = 0.0;
  157. SOI::TempSkinsData[skinid][SOI::ry] = 0.0;
  158. SOI::TempSkinsData[skinid][SOI::rz] = 0.0;
  159. SOI::TempSkinsData[skinid][SOI::sx] = 0.0;
  160. SOI::TempSkinsData[skinid][SOI::sy] = 0.0;
  161. SOI::TempSkinsData[skinid][SOI::sz] = 0.0;
  162. }
  163. SOI::TempFileData[SOI::active] = true;
  164. SOI::TempFileData[SOI::modelid] = modelid;
  165. return 1;
  166. }
  167. new File:inpf = fopen(file_name,io_read);
  168. if(!inpf) return 0;
  169. if(flength(inpf) != SOI_FILE_SIZE){
  170. fclose(inpf);
  171. return 0;
  172. }
  173. //Get Header
  174. new h_len = strlen(SOI_HEADER_KEY), h_key[32];
  175. for(new i = 0; i < h_len; i++){
  176. h_key[i] = fgetchar(inpf,0,false);
  177. }
  178. h_key[h_len] = EOS;
  179. if(!strcmp(h_key,SOI_HEADER_KEY,true)){
  180. for(new skinid = 0; skinid < MAX_SKINS; skinid++){
  181. SOI_MergeValue(SOI::TempSkinsData[skinid][SOI::bone],0,0,0,fgetchar(inpf,0,false));
  182. SOI_MergeFloat(SOI::TempSkinsData[skinid][SOI::x],fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false));
  183. SOI_MergeFloat(SOI::TempSkinsData[skinid][SOI::y],fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false));
  184. SOI_MergeFloat(SOI::TempSkinsData[skinid][SOI::z],fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false));
  185. SOI_MergeFloat(SOI::TempSkinsData[skinid][SOI::rx],fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false));
  186. SOI_MergeFloat(SOI::TempSkinsData[skinid][SOI::ry],fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false));
  187. SOI_MergeFloat(SOI::TempSkinsData[skinid][SOI::rz],fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false));
  188. SOI_MergeFloat(SOI::TempSkinsData[skinid][SOI::sx],fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false));
  189. SOI_MergeFloat(SOI::TempSkinsData[skinid][SOI::sy],fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false));
  190. SOI_MergeFloat(SOI::TempSkinsData[skinid][SOI::sz],fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false));
  191. SOI::TempSkinsData[skinid][SOI::set] = true;
  192. }
  193. SOI::TempFileData[SOI::active] = true;
  194. SOI::TempFileData[SOI::modelid] = modelid;
  195. fclose(inpf);
  196. return 1;
  197. } else {
  198. fclose(inpf);
  199. return 0;
  200. }
  201. }
  202. SOI::Function:: SOI::DumpTempData(){
  203. if(!SOI::TempFileData[SOI::active]) return 0;
  204. new file_name[64];
  205. format(file_name,sizeof(file_name),"/SOI/%d.soi",SOI::TempFileData[SOI::modelid]);
  206. if(fexist(file_name)) fremove(file_name);
  207. new File:outf = fopen(file_name,io_write);
  208. if(!outf) return 0;
  209. new int1, int2, int3, int4, bone,
  210. Float:x,Float:y,Float:z,
  211. Float:rx,Float:ry,Float:rz,
  212. Float:sx,Float:sy,Float:sz;
  213. fwrite(outf,SOI_HEADER_KEY);
  214. for(new skinid = 0; skinid < MAX_SKINS; skinid++){
  215. if(!SOI::TempSkinsData[skinid][SOI::set]){
  216. SOI::GetDefaultSkinOffset(bone,x,y,z,rx,ry,rz,sx,sy,sz);
  217. SOI::SetTempSkinOffset(skinid,bone,x,y,z,rx,ry,rz,sx,sy,sz);
  218. }
  219. }
  220. for(new skinid = 0; skinid < MAX_SKINS; skinid++){
  221. SOI_ExtractValue(SOI::TempSkinsData[skinid][SOI::bone],int1,int2,int3,int4);
  222. fputchar(outf,int4,false);
  223. SOI_ExtractFloat(SOI::TempSkinsData[skinid][SOI::x],int1,int2,int3,int4);
  224. fputchar(outf,int1,false), fputchar(outf,int2,false), fputchar(outf,int3,false), fputchar(outf,int4,false);
  225. SOI_ExtractFloat(SOI::TempSkinsData[skinid][SOI::y],int1,int2,int3,int4);
  226. fputchar(outf,int1,false), fputchar(outf,int2,false), fputchar(outf,int3,false), fputchar(outf,int4,false);
  227. SOI_ExtractFloat(SOI::TempSkinsData[skinid][SOI::z],int1,int2,int3,int4);
  228. fputchar(outf,int1,false), fputchar(outf,int2,false), fputchar(outf,int3,false), fputchar(outf,int4,false);
  229. SOI_ExtractFloat(SOI::TempSkinsData[skinid][SOI::rx],int1,int2,int3,int4);
  230. fputchar(outf,int1,false), fputchar(outf,int2,false), fputchar(outf,int3,false), fputchar(outf,int4,false);
  231. SOI_ExtractFloat(SOI::TempSkinsData[skinid][SOI::ry],int1,int2,int3,int4);
  232. fputchar(outf,int1,false), fputchar(outf,int2,false), fputchar(outf,int3,false), fputchar(outf,int4,false);
  233. SOI_ExtractFloat(SOI::TempSkinsData[skinid][SOI::rz],int1,int2,int3,int4);
  234. fputchar(outf,int1,false), fputchar(outf,int2,false), fputchar(outf,int3,false), fputchar(outf,int4,false);
  235. SOI_ExtractFloat(SOI::TempSkinsData[skinid][SOI::sx],int1,int2,int3,int4);
  236. fputchar(outf,int1,false), fputchar(outf,int2,false), fputchar(outf,int3,false), fputchar(outf,int4,false);
  237. SOI_ExtractFloat(SOI::TempSkinsData[skinid][SOI::sy],int1,int2,int3,int4);
  238. fputchar(outf,int1,false), fputchar(outf,int2,false), fputchar(outf,int3,false), fputchar(outf,int4,false);
  239. SOI_ExtractFloat(SOI::TempSkinsData[skinid][SOI::sz],int1,int2,int3,int4);
  240. fputchar(outf,int1,false), fputchar(outf,int2,false), fputchar(outf,int3,false), fputchar(outf,int4,false);
  241. }
  242. fclose(outf);
  243. return 1;
  244. }
  245. #endif
  246. SOI::Function:: SOI::GetSkinOffset(modelid,skinid,&bone,&Float:x,&Float:y,&Float:z,&Float:rx=0.0,&Float:ry=0.0,&Float:rz=0.0,&Float:sx=0.0,&Float:sy=0.0,&Float:sz=0.0){
  247. if(skinid < 0 || skinid >= MAX_SKINS) return 0;
  248. new file_name[64];
  249. format(file_name,sizeof(file_name),"/SOI/%d.soi",modelid);
  250. if(!fexist(file_name)) return 0;
  251. new File:inpf = fopen(file_name,io_read);
  252. if(!inpf) return 0;
  253. if(flength(inpf) != SOI_FILE_SIZE){
  254. fclose(inpf);
  255. return 0;
  256. }
  257. fseek(inpf,11+(skinid*37),seek_start);
  258. SOI_MergeValue(bone,0,0,0,fgetchar(inpf,0,false));
  259. SOI_MergeFloat(x,fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false));
  260. SOI_MergeFloat(y,fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false));
  261. SOI_MergeFloat(z,fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false));
  262. SOI_MergeFloat(rx,fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false));
  263. SOI_MergeFloat(ry,fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false));
  264. SOI_MergeFloat(rz,fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false));
  265. SOI_MergeFloat(sx,fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false));
  266. SOI_MergeFloat(sy,fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false));
  267. SOI_MergeFloat(sz,fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false),fgetchar(inpf,0,false));
  268. fclose(inpf);
  269. return 1;
  270. }
  271. //EOF