Shrooms

Untitled

Feb 12th, 2014
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.37 KB | None | 0 0
  1. After looking over Pedra's mob struct information, etc I managed to find the one that controls platforms.
  2.  
  3. Using this, it's possible to make your own "Active" or "Live" pvac that doesn't require .wz edits or a CRC bypass (by directly modifying the structure).
  4.  
  5. The platform structure works as a linked list just like the mob structure, as follows:
  6.  
  7. GMS 0.62:
  8.  
  9. 0x978138[0x88] = firstplatform+0x10 (just like mob structure).
  10.  
  11. Code:
  12. platformlist:
  13. 0 = seh or template address
  14. 4 = nextplatformlist (is a ptr)
  15. 8 = previousplatformlist (is a ptr)
  16. ...
  17. 10 = ep of the base ptr (if is first platform in list)
  18. 14 = platformdata
  19. 18 = sizeof(struct)
  20.  
  21. platformdata:
  22. 0 = seh or template address
  23. ...
  24. c = left boundary of platform
  25. 10 = top boundary of platform
  26. 14 = right boundary of platform
  27. 18 = bottom boundary of platform
  28. ...
  29. 30 = an unknown "double byte value"
  30. 38 = an unknown "double byte value"
  31. 40 = an unknown "double byte value"
  32. 48 = the .wz platformID of the platform
  33. 4c = nextplatformdata (follows .wz defintions, is a ptr)
  34. 50 = previousplatformdata (follows .wz defintions, is a ptr)
  35. ...
  36. 80 = sizeof(struct)
  37.  
  38. Code:
  39.  
  40. struct platdata {
  41. unsigned template1;
  42. unsigned unknown2;
  43. unsigned unknown3;
  44. unsigned left;
  45. unsigned top;
  46. unsigned right;
  47. unsigned bottom;
  48. unsigned unknown8;
  49. unsigned unknown9;
  50. unsigned unknown10;
  51. unsigned unknown11;
  52. unsigned unknown12;
  53. double unknown13;
  54. double unknown14;
  55. double unknown15;
  56. unsigned platformid;
  57. platdata* next;
  58. platdata* previous;
  59. unsigned unknown19;
  60. unsigned unknown20;
  61. unsigned unknown21;
  62. unsigned unknown22;
  63. unsigned unknown23;
  64. unsigned unknown24;
  65. unsigned unknown25;
  66. unsigned unknown26;
  67. unsigned unknown27;
  68. unsigned unknown28;
  69. unsigned unknown29;
  70. unsigned size;
  71. };
  72.  
  73. struct platlist {
  74. unsigned template1;
  75. platlist* next;
  76. platlist* previous;
  77. unsigned template2;
  78. unsigned unknown;
  79. platdata* data;
  80. unsigned size;
  81. };
  82.  
  83.  
  84. And functions for accessing/reading the structs:
  85.  
  86. Code:
  87.  
  88. unsigned platlistaddr = 0x978138;
  89. unsigned platlistoffset = 0x88;
  90.  
  91. unsigned long readPointer( unsigned long addr, unsigned long offset)
  92. {
  93. if ( IsBadReadPtr( (void*) addr, 4 ) != 0 ) {
  94. return -1;
  95. }
  96. unsigned long *ptr = (unsigned long*) addr;
  97. unsigned long base = ptr[0];
  98. if ( IsBadReadPtr( (void*) (base+offset), 4 ) != 0 ) {
  99. return -1;
  100. }
  101. ptr = (unsigned long*) (base+offset);
  102. return ptr[0];
  103. }
  104.  
  105. platlist* getPlatList() {
  106. unsigned platlistreal = readPointer(platlistaddr,platlistoffset);
  107. if(platlistreal==0)
  108. return NULL;
  109. platlistreal-=0x10;
  110. return (platlist*)platlistreal;
  111. }
  112.  
  113. unsigned getPlatNumberFromPlatData(platdata* obj) {
  114. if(obj==NULL)
  115. return -1;
  116.  
  117. return obj->platformid;
  118. }
  119.  
  120. platdata* getPlatDataByPlatId(unsigned id) {
  121. platlist* thisplat = getPlatList();
  122. while(thisplat!=NULL) {
  123. if(getPlatNumberFromPlatData(thisplat->data) == id)
  124. return thisplat->data;
  125. thisplat = thisplat->next;
  126. }
  127. return NULL;
  128. }
  129.  
  130. Code:
  131.  
  132. platlist* addPlatform(platlist* original) {
  133. platlist* newplat = new platlist;
  134. memcpy(newplat,original,sizeof(platlist));
  135. platdata* newdata = new platdata;
  136. memcpy(newdata,original->data,sizeof(platdata));
  137. newplat->data = newdata;
  138. return newplat;
  139. }
  140.  
  141. platlist* getFirstPlatform() {
  142. return getPlatList();
  143. }
  144.  
  145. platlist* getLastPlatform() {
  146. platlist* thisplat = getPlatList();
  147. while(thisplat!=NULL) {
  148. if(thisplat->next==NULL)
  149. break;
  150. thisplat = thisplat->next;
  151. }
  152. return thisplat; //FIXED NAO
  153. }
  154.  
  155. Code:
  156.  
  157. platlist* getPlatListByPlatId(unsigned id) {
  158. platlist* thisplat = getPlatList();
  159. while(thisplat!=NULL) {
  160. if(thisplat->data->platformid == id)
  161. return thisplat;
  162. thisplat = thisplat->next;
  163. }
  164. return NULL;
  165. }
  166.  
  167. void duplicatePlatforms() {
  168. platlist* lastplat = getLastPlatform();
  169. if(!lastplat)
  170. return;
  171. platlist* thisplat=getFirstPlatform();
  172. int totalplats = lastplat->data->platformid;
  173. int originaltotalplats = totalplats;
  174. platlist* firstdupedplatform = NULL;
  175. int curpos = 1;
  176. while(curpos <= originaltotalplats) {
  177. platlist* newplat = addPlatform(thisplat);
  178. if(!newplat)
  179. break;
  180. if(!firstdupedplatform)
  181. firstdupedplatform = newplat;
  182.  
  183. totalplats++;
  184. newplat->data->platformid = totalplats;
  185. newplat->previous = lastplat;
  186. newplat->next = 0;
  187. lastplat->next = newplat;
  188. lastplat = newplat;
  189. thisplat = thisplat->next;
  190. curpos++;
  191. }
  192.  
  193. //redirecting new platforms
  194.  
  195. thisplat = firstdupedplatform;
  196. while(thisplat!=NULL) {
  197. int next = getPlatNumberFromPlatData(thisplat->data->next);
  198. int nextget = originaltotalplats+next;
  199. if(next!=-1)
  200. thisplat->data->next = getPlatDataByPlatId(nextget);
  201.  
  202. int previous = getPlatNumberFromPlatData(thisplat->data->previous);
  203. int previousget = originaltotalplats+previous;
  204. if(previous!=-1)
  205. thisplat->data->previous = getPlatDataByPlatId(previousget);
  206.  
  207. thisplat = thisplat->next;
  208. }
  209.  
  210. //redirecting old platforms
  211.  
  212. thisplat = getFirstPlatform();
  213. while(thisplat!=firstdupedplatform) {
  214. int next = getPlatNumberFromPlatData(thisplat->data->next);
  215. int nextget = originaltotalplats+next;
  216. if(next!=-1)
  217. thisplat->data->next = getPlatDataByPlatId(nextget);
  218.  
  219. int previous = getPlatNumberFromPlatData(thisplat->data->previous);
  220. int previousget = originaltotalplats+previous;
  221. if(previous!=-1)
  222. thisplat->data->previous = getPlatDataByPlatId(previousget);
  223.  
  224. thisplat = thisplat->next;
  225. }
  226. }
Advertisement
Add Comment
Please, Sign In to add comment