diff --git a/itemImageFramesGenerator.html b/itemImageFramesGenerator.html
new file mode 100644
index 0000000..153e77d
--- /dev/null
+++ b/itemImageFramesGenerator.html
@@ -0,0 +1,42 @@
+
+
+ Item Image Frames Generator - OpenTibiaLibrary
+
+
+
+Item image frames generator (for animated items PHP script)
+
+ How to use:
+ 1. Type version of Tibia client.
+ 2. Select SPR, DAT and OTB files.
+ 3. Click "LOAD FILES", watch "Progress".
+ 4. Click "GENERATE IMAGES", wait for ZIP file download.
+ 5. Convert generated PNG images into animations using:
+ https://item-images.ots.me/png-to-gif-converter/
+ You can also download https://github.com/gesior/open-tibia-library
+ and use command line PHP script "tools/item-image-frames-to-animated-gif-converter/cli_convert.php"
+ to convert it to animations on your PC
+
+ FILES ARE NOT SEND TO SERVER! EVERYTHING IS GENERATED ON YOUR COMPUTER.
+
+ (Enable Developer console in webbrowser to get more information about problems/progress)
+
+Client Version: (format 860, NOT 8.60)
+Sprite file:
+Dat file:
+Otb file:
+Only pickable items:
+Force enable extended sprites: (for old clients .dat and .spr
+with this feature enabled)
+
+LOAD FILES
+
+
+GENERATE IMAGES
+
+
+Progress: Not running
+
+
+
+
diff --git a/itemImageFramesGenerator.ts b/itemImageFramesGenerator.ts
new file mode 100644
index 0000000..fa446df
--- /dev/null
+++ b/itemImageFramesGenerator.ts
@@ -0,0 +1,111 @@
+import {DatManager} from "./modules/datFile/datManager";
+import {OtbManager} from "./modules/otbFile/otbManager";
+import {SpriteManager} from "./modules/sprFile/spriteManager";
+import {ImageGenerator} from "./modules/imageGenerator/imageGenerator";
+import {GameFeature} from "./modules/constants/const";
+import {WebsiteImageGeneratorBase} from "./websiteImageGeneratorBase";
+
+class ItemImageGenerator extends WebsiteImageGeneratorBase {
+ private onlyPickupableCheckbox: HTMLInputElement;
+ private forceEnableExtendedSpritesCheckbox: HTMLInputElement;
+
+ private onlyPickupable = true;
+ private forceEnableExtendedSprites = false;
+
+ init() {
+ super.init();
+ this.onlyPickupableCheckbox = document.getElementById('onlyPickupable');
+ this.forceEnableExtendedSpritesCheckbox = document.getElementById('forceEnableExtendedSprites');
+ }
+
+ afterSetClientVersion() {
+ if (this.forceEnableExtendedSpritesCheckbox.checked) {
+ this.client.enableFeature(GameFeature.GameSpritesU32);
+ }
+ }
+
+ startImageGenerator(imageGenerator: ImageGenerator, otbManager: OtbManager, datManager: DatManager, spriteManager: SpriteManager, zip) {
+ this.onlyPickupable = this.onlyPickupableCheckbox.checked;
+ this.generateItemImage(imageGenerator, zip, 0);
+ }
+
+ generateItemImage(imageGenerator: ImageGenerator, zip, serverId: number) {
+ const self = this;
+ this.progressValue(serverId, this.otbManager.getLastId());
+ if (serverId > this.otbManager.getLastId()) {
+ this.progressText('Packing images to ZIP file, please wait (it may take a while)');
+ zip.generateAsync({type: "blob"}).then(function (blob: Blob) {
+ console.log('zip size', blob.size);
+ self.progressText('ZIP generated, it should start download now.');
+ self.downloadBlob('items.zip', blob);
+ });
+ return;
+ }
+
+ if (!this.otbManager.isValidOtbId(serverId)) {
+ setTimeout(function () {
+ self.generateItemImage(imageGenerator, zip, serverId + 1);
+ }, 1);
+ return;
+ }
+
+ const clientItemId = this.otbManager.getItem(serverId).getClientId();
+ if (!clientItemId) {
+ console.log('otb ID not mapped to any dat ID', serverId);
+ setTimeout(function () {
+ self.generateItemImage(imageGenerator, zip, serverId + 1);
+ }, 1);
+ return;
+ }
+ let itemThingType = this.datManager.getItem(clientItemId);
+ if (!itemThingType) {
+ console.log('dat ID not found in dat file', serverId, clientItemId);
+ setTimeout(function () {
+ self.generateItemImage(imageGenerator, zip, serverId + 1);
+ }, 1);
+ return;
+ }
+ if (this.onlyPickupable && !itemThingType.isPickupable()) {
+ console.log('skip not pickupable', serverId);
+ setTimeout(function () {
+ self.generateItemImage(imageGenerator, zip, serverId + 1);
+ }, 1);
+ return;
+ }
+
+ const itemSprites = imageGenerator.generateItemImagesByServerId(serverId);
+ if (!itemSprites || itemSprites.length == 0) {
+ setTimeout(function () {
+ self.generateItemImage(imageGenerator, zip, serverId + 1);
+ }, 1);
+ return;
+ }
+
+ const firstItemSprite = itemSprites[0];
+ const canvas = document.createElement('canvas');
+ canvas.width = firstItemSprite.getWidth() * itemSprites.length;
+ canvas.height = firstItemSprite.getHeight();
+ document.getElementsByTagName('body')[0].appendChild(canvas);
+ const ctx = canvas.getContext("2d");
+
+ for (let animationFrame = 0; animationFrame < itemSprites.length; animationFrame++) {
+ const palette = ctx.getImageData(firstItemSprite.getWidth() * animationFrame, 0, firstItemSprite.getWidth(), firstItemSprite.getHeight());
+ const itemSprite = itemSprites[animationFrame];
+ palette.data.set(new Uint8ClampedArray(itemSprite.getPixels().m_buffer.buffer));
+ ctx.putImageData(palette, firstItemSprite.getWidth() * animationFrame, 0);
+ }
+
+ const callback = function (blob) {
+ canvas.remove();
+ zip.file('items/' + serverId + '_' + itemSprites.length + '.png', blob);
+ setTimeout(function () {
+ self.generateItemImage(imageGenerator, zip, serverId + 1);
+ }, 1);
+
+ };
+ canvas.toBlob(callback);
+ }
+}
+
+const itemImageGenerator = new ItemImageGenerator();
+itemImageGenerator.init();
diff --git a/itemImageGenerator.html b/itemImageGenerator.html
index bf655be..898eb4e 100644
--- a/itemImageGenerator.html
+++ b/itemImageGenerator.html
@@ -2,40 +2,36 @@
Item Image Generator - OpenTibiaLibrary
-
+Item images generator
- How to use:
- 1. Type version of Tibia client.
- 2. Select SPR, DAT and OTB files.
- 3. Click "LOAD FILES", watch "Progress".
- 4. Click "GENERATE IMAGES", wait for ZIP file download.
-
- FILES ARE NOT SEND TO SERVER! EVERYTHING IS GENERATED ON YOUR COMPUTER.
-
+ How to use:
+ 1. Type version of Tibia client.
+ 2. Select SPR, DAT and OTB files.
+ 3. Click "LOAD FILES", watch "Progress".
+ 4. Click "GENERATE IMAGES", wait for ZIP file download.
+
+ FILES ARE NOT SEND TO SERVER! EVERYTHING IS GENERATED ON YOUR COMPUTER.
+
(Enable Developer console in webbrowser to get more information about problems/progress)
-Client Version: (format 860, NOT 8.60)
-Sprite file:
-Dat file:
-Otb file:
-Only pickable items:
-
-LOAD FILES
-
-GENERATE IMAGES
-
-Progress: Not running
+Client Version: (format 860, NOT 8.60)
+Sprite file:
+Dat file:
+Otb file:
+Only pickable items:
+Force enable extended sprites: (for old clients .dat and .spr
+with this feature enabled)
+
+LOAD FILES
+
+
+GENERATE IMAGES
+
+
+Progress: Not running
-
-