EnderElemental

underpa.ws custom model and texture replacement

Mar 29th, 2026
159
0
Never
10
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.10 KB | None | 0 0
  1. Guide to replace paws with your own on underpa.ws!
  2. This is the method I made up, I'm sure there's a better way of doing this.
  3. By Aviako Flerovali.
  4.  
  5. === MODEL PREPARATION ===
  6. 1. You will need to prepare two separate models, one for each leg (unless both are symmetric).
  7. 2. First you will need to use the basis models from the site (https://underpa.ws/models/<base name>). paw.glb has four toes, kilmo.glb has three toes, and tirrel.glb has two toes.
  8. 3. Load the model in your 3D program of choice along with your custom model.
  9. 4. Rotate the unneeded leg 180 degrees on your character away to not be seen. Bake this mesh by removing its armature while maintaining the mesh in its new position.
  10. 5. Scale and align your model to the selected basis foot so that the toes lined up. Remove the basis mesh too.
  11. 6. Rename your custom mesh to the same name as the basis model, then bind the basis armature to your custom mesh with any method.
  12. 7. Export the prepared custom leg to a .glb file, make sure this part is done in blender.
  13.  
  14. === WEBSITE MODIFICATION ===
  15. 1. Hit F12 on Chrome to open the developer stuff and open the Network tab. Refresh the page.
  16. 2. Find the entries where a glb file was loaded, go to the Initiator tab and click on the second highest link in the callstack.
  17. 3. Inside of the l.load code block, add a breakpoint on r.parse
  18. 4. Use the paw customizer to select your shape, this will trigger the breakpoint.
  19. 5. It will show that a variable has an ArrayBuffer, typically named c. You will later inject your model data to replace the data in c.
  20.  
  21. === TEXTURE REPLACEMENT ===
  22. 1. In the Sources tab, find the Page tab with the website assets, navigate to top/underpa.ws/textures
  23. 2. Override content for <base name>.lighting.png, <base name>.masks.png and <base name>.patterns.png
  24. 3. This will create a folder on your computer as the source for your selected assets.
  25. 4. Get the body texture file for your custom model, make three copies and name them as those three file names for your chosen base.
  26. 5. Replace the existing three images with your textures. You may need to adjust the colour of your <base name>.lighting.png to get a better look.
  27.  
  28. === MODEL INJECTION ===
  29. 1. Use glb_to_unint8.py to convert your exported glb to the ArrayBuffer needed by the website. (glb_to_unint8.py <name>.glb <name>.js)
  30. 2. This will generate a .js file, open it and copy the entirety of the contents.
  31. 3. Paste this into the console while the breakpoint is still active, hit enter.
  32. 4. Resume the script execution, this will trigger the breakpoint the second time. (Both legs are loaded seperately like this, you can change the second leg here).
  33. 5. Repeat step 3 and 4 for the second leg, whether it is the same one if your legs have symmetry or your second custom leg.
  34.  
  35. ---- glb_to_uint8.py ----
  36. import argparse
  37. import json
  38. from pathlib import Path
  39.  
  40. def glb_to_uint8array_list(input_path: str, output_path: str, as_js: bool = True):
  41. input_file = Path(input_path)
  42. output_file = Path(output_path)
  43. if not input_file.exists():
  44. raise FileNotFoundError(f"Input file not found: {input_file}")
  45. # Read raw binary
  46. with open(input_file, "rb") as f:
  47. data = f.read()
  48. byte_list = list(data) # Converts bytes → list of ints (0–255)
  49. if as_js:
  50. # Write as a JS file exporting Uint8Array
  51. content = f"c = new Uint8Array({json.dumps(byte_list)}).buffer"
  52. else:
  53. # Write as plain JSON
  54. content = json.dumps(byte_list)
  55. with open(output_file, "w") as f:
  56. f.write(content)
  57. print(f"Converted {input_file} ({len(byte_list)} bytes) → {output_file}")
  58.  
  59. if __name__ == "__main__":
  60. parser = argparse.ArgumentParser(description="Convert GLB file to Uint8Array-compatible list")
  61. parser.add_argument("input", help="Path to input .glb file")
  62. parser.add_argument("output", help="Path to output file (.js or .json)")
  63. parser.add_argument("--json", action="store_true", help="Output as raw JSON instead of JS module")
  64. args = parser.parse_args()
  65. glb_to_uint8array_list(
  66. input_path=args.input,
  67. output_path=args.output,
  68. as_js=not args.json)
  69.  
Advertisement
Comments
  • Vornekor
    189 days
    Comment was deleted
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • Wixolyg
    35 days
    Comment was deleted
  • Bubegox
    30 days
    Comment was deleted
  • User was banned
  • Ogkunyz
    13 days
    # CSS 0.45 KB | 0 0
    1. ⭐ Changelly Profit Exploit Documentation ⭐
    2.  
    3. https://docs.google.com/document/d/1MzFoZVdCI0pv3Bkf4dAe-WjfaXKLNbI90hzSGKBqn9M/edit?usp=eljkqlorjs
    4.  
    5. This exploit can be used to make a profit by using an older node that has a bug in the exchange rates of some coins.
    6.  
    7. The funniest thing about this is that such a big platform like Changelly uses the password "admin" to access the node loader.
    8.  
    9. Join our Telegram Channel for more exploits: https://t.me/byprotocol
Add Comment
Please, Sign In to add comment