Jump to content

Recommended Posts

Hello, am having issue that whenever i put my map into client and warp on the map .. i see buggy black screen with flickering textures when i look around. i tried to pack it again or save it again and i still having same problem .. any solution ? spacer.png

Link to comment
https://metin2.dev/topic/2747-worldeditor-remix/page/15/#findComment-173239
Share on other sites

On 11/29/2025 at 5:00 AM, Horus said:

Hi, I can’t open the WE, any suggestions?

As for suggestions to improve the program:

1. Flexibility in scaling the objects/spt’s/effects/perhaps anything that can be rescaled, I guess. I already have a tool that might give you a hand.

2. Generating MDTAR collision (polygon, sphere, square) with possibility to auto generate and fit it on the object.,

3. A method to check for broken files? (trees, objects)

4. Would be a thing having an editor for areadata.txt inside the WE where you as a mapper can replace the object via its property number, instead of trying to find the object in the map, that way we can perhaps scan it somehow just to replace in the same position. Might be worth.

-  Can you also add a search bar where we can paste the property id and teleport to the object? HERE 

5. How can we have a grid, similarity to Minecraft’s chunk system? Would be easier to detect where the 2 sides of the different TEXTURES meet.

All this are suggestions to improve and make mapper’s lives easier. No hard feelings for the developer.

Can you also add a search bar where we can paste the property id and teleport to the object?

 

you can also doppleclick on a object in the hierachy to teleport. but is good idea, to put some points.

Edited by Metin2 Dev International
Core X - External 2 Internal
Link to comment
https://metin2.dev/topic/2747-worldeditor-remix/page/15/#findComment-173251
Share on other sites

  • Active Member
6 hours ago, Ace said:

Can you also add a search bar where we can paste the property id and teleport to the object?

 

you can also doppleclick on a object in the hierachy to teleport. but is good idea, to put some points.

I know that, but could be better adding property numbers and that search bar there as well 😄

  • Good 1
Link to comment
https://metin2.dev/topic/2747-worldeditor-remix/page/15/#findComment-173256
Share on other sites

  • Honorable Member
On 11/29/2025 at 5:00 AM, Horus said:

Hi, I can’t open the WE, any suggestions?

 

  

On 11/29/2025 at 6:05 AM, daisamaa said:

I am also experiencing the same issue with v48

OS version?
PC Language?
Do you have any .dmp file inside logs/?
Do you have ENABLE_PYTHON set on true or false inside WorldEditorRemix.ini? (if line is missing, it's false)

 

  

On 11/29/2025 at 9:01 AM, dewolution said:

am having issue that whenever i put my map into client

1) check if the .msenv is loaded correctly

2) check if the textureset is loaded correctly

3) check if the map settings.txt contains 
TerrainVisible    0

4) check if the map base coordinates are multiple than 12800 or 0

5) if nothing works, compile the launcher in debug mode and see the console

Edited by martysama0134
  • Metin2 Dev 1
  • Good 1
Link to comment
https://metin2.dev/topic/2747-worldeditor-remix/page/15/#findComment-173266
Share on other sites

3 minutes ago, martysama0134 said:

  

OS version?
PC Language?
Do you have any .dmp file inside logs/?
Do you have ENABLE_PYTHON set on true or false inside WorldEditorRemix.ini? (if line is missing, it's false)

OS version: Win11
PC Language: English
Do you have any .dmp file inside logs: No 
Do you have ENABLE_PYTHON set on true or false inside WorldEditorRemix.ini: ENABLE_PYTHON The line exists and contains false

Link to comment
https://metin2.dev/topic/2747-worldeditor-remix/page/15/#findComment-173269
Share on other sites

On 11/29/2025 at 9:01 AM, dewolution said:

Hello, am having issue that whenever i put my map into client and warp on the map .. i see buggy black screen with flickering textures when i look around. i tried to pack it again or save it again and i still having same problem .. any solution ? spacer.png

With the old clients, there were two atlasinfo.txt files, and both were always identical. The problem was that if there were two empty lines or an enter at the end, the map wouldn't load correctly. Check your settings.txt file for the map, both server-side and client-side. In atlasinfo.txt, pay attention to what you've changed. Ideally, you should insert the map somewhere in the middle by copying or duplicating an existing map and then replacing it with yours. Check your settings and make sure the texture set, environment, etc., are all correctly linked on both the server-side and client-side.

Link to comment
https://metin2.dev/topic/2747-worldeditor-remix/page/15/#findComment-173273
Share on other sites

  • Active Member
4 hours ago, daisamaa said:

OS version: Win11
PC Language: English
Do you have any .dmp file inside logs: No 
Do you have ENABLE_PYTHON set on true or false inside WorldEditorRemix.ini: ENABLE_PYTHON The line exists and contains false

Same and when I open WorldEditorRemix_MfcDebug_v48 shows THIS

Edited by Metin2 Dev International
Core X - External 2 Internal
  • Flame 1
Link to comment
https://metin2.dev/topic/2747-worldeditor-remix/page/15/#findComment-173275
Share on other sites

  • Active+ Member
On 11/29/2025 at 6:00 AM, Horus said:

Hi, I can’t open the WE, any suggestions?

As for suggestions to improve the program:

1. Flexibility in scaling the objects/spt’s/effects/perhaps anything that can be rescaled, I guess. I already have a tool that might give you a hand.

2. Generating MDTAR collision (polygon, sphere, square) with possibility to auto generate and fit it on the object.,

3. A method to check for broken files? (trees, objects)

4. Would be a thing having an editor for areadata.txt inside the WE where you as a mapper can replace the object via its property number, instead of trying to find the object in the map, that way we can perhaps scan it somehow just to replace in the same position. Might be worth.

-  Can you also add a search bar where we can paste the property id and teleport to the object? HERE 

5. How can we have a grid, similarity to Minecraft’s chunk system? Would be easier to detect where the 2 sides of the different TEXTURES meet.

All this are suggestions to improve and make mapper’s lives easier. No hard feelings for the developer.

for the 2nd suggestion, I believe it will hard to do so. You need to find a way to read the model basically. I've tried doing this in 3ds without proper results tho. 

Edited by Metin2 Dev International
Core X - External 2 Internal
Link to comment
https://metin2.dev/topic/2747-worldeditor-remix/page/15/#findComment-173280
Share on other sites

  • Honorable Member

V48 TestFix002 out! This is a minor version fix.

- Fix startup crash on very few PCs 

- Improved the export map by force-including any potential used property's pointed object (probably not needed)

- Removed from the export map blacklist some gate's effects' textures: gatein.dds, detail_lens.dds, upline.dds

 

On 11/29/2025 at 5:00 AM, Horus said:

1. Flexibility in scaling the objects/spt’s/effects/perhaps anything that can be rescaled, I guess. I already have a tool that might give you a hand.

Any scaling will need the proper implementation in the launcher. Currently that feature is not public/released in a proper manner.

Even if I add scale support to the WEREMIX, many won't be able to see any scaled objects ingame. I would need to release a full scale system too for the launcher.

On 11/29/2025 at 5:00 AM, Horus said:

2. Generating MDATR collision (polygon, sphere, square) with possibility to auto generate and fit it on the object.

Right now, the .mdatr files can be generated via 3dsmax script (in the download folder WE/Etc/3dsmax-scripts/ you find the script).

To manipulate mdatr files you probably need a new 5th window tab just for that (besides the FLY one). It is important to visually set the correct height, and collision's data size, position, and shape. It can't be automatically generated without all this information, otherwise it would be useless.

This is a summary of what .mdatr contains:

File Structure:
1. Header: "AttributeData" (13 bytes + null terminator = 14 bytes)
2. DWORD: collision_data_count
3. DWORD: height_data_count
4. For each collision:
   - DWORD: type (COLLISION_TYPE_*)
   - 32 bytes: name (null-terminated)
   - D3DXVECTOR3: position (12 bytes)
   - Dimensions: varies by type
     * PLANE: 2 floats (8 bytes)
     * BOX: 3 floats (12 bytes)
     * SPHERE: 1 float (4 bytes)
     * CYLINDER: 2 floats (8 bytes)
     * AABB: 3 floats (12 bytes)
     * OBB: 3 floats (12 bytes)
   - D3DXQUATERNION: rotation (16 bytes)
5. For each height data:
   - 32 bytes: name
   - DWORD: primitive_count
   - Array of D3DXVECTOR3 (primitive_count * 12 bytes)

 

Edited by Metin2 Dev International
Core X - External 2 Internal
  • Metin2 Dev 3
  • Love 1
  • Love 6
Link to comment
https://metin2.dev/topic/2747-worldeditor-remix/page/15/#findComment-173337
Share on other sites

  • Active Member
On 12/2/2025 at 9:56 PM, martysama0134 said:

V48 TestFix002 out! This is a minor version fix.

- Fix startup crash on very few PCs 

- Improved the export map by force-including any potential used property's pointed object (probably not needed)

- Removed from the export map blacklist some gate's effects' textures: gatein.dds, detail_lens.dds, upline.dds

 

Any scaling will need the proper implementation in the launcher. Currently that feature is not public/released in a proper manner.

Even if I add scale support to the WEREMIX, many won't be able to see any scaled objects ingame. I would need to release a full scale system too for the launcher.

Right now, the .mdatr files can be generated via 3dsmax script (in the download folder WE/Etc/3dsmax-scripts/ you find the script).

To manipulate mdatr files you probably need a new 5th window tab just for that (besides the FLY one). It is important to visually set the correct height, and collision's data size, position, and shape. It can't be automatically generated without all this information, otherwise it would be useless.

This is a summary of what .mdatr contains:

File Structure:
1. Header: "AttributeData" (13 bytes + null terminator = 14 bytes)
2. DWORD: collision_data_count
3. DWORD: height_data_count
4. For each collision:
   - DWORD: type (COLLISION_TYPE_*)
   - 32 bytes: name (null-terminated)
   - D3DXVECTOR3: position (12 bytes)
   - Dimensions: varies by type
     * PLANE: 2 floats (8 bytes)
     * BOX: 3 floats (12 bytes)
     * SPHERE: 1 float (4 bytes)
     * CYLINDER: 2 floats (8 bytes)
     * AABB: 3 floats (12 bytes)
     * OBB: 3 floats (12 bytes)
   - D3DXQUATERNION: rotation (16 bytes)
5. For each height data:
   - 32 bytes: name
   - DWORD: primitive_count
   - Array of D3DXVECTOR3 (primitive_count * 12 bytes)

 

Thank you for that.  I got one more suggestion: It is possible that when you make a selection of multiple objects, that selection will turn into one object when we want to rotate the selection of objects?  https://metin2.download/video/rLd042w65gzptIZIcnov5c6c70F75R2q/.mp4

Edited by Metin2 Dev International
Core X - External 2 Internal
  • Think 1
  • Good 2
Link to comment
https://metin2.dev/topic/2747-worldeditor-remix/page/15/#findComment-173397
Share on other sites

  • Honorable Member
On 12/5/2025 at 11:14 PM, Horus said:

I got one more suggestion: It is possible that when you make a selection of multiple objects, that selection will turn into one object when we want to rotate the selection of objects?

In the v49 I've implemented it via shortcut only MouseWheel+8. It looks like this:  

; # MouseWheel+8    rotate selected objects z around a common pivot

I've uploaded "we_remix_v49__prerelease01__20251210-1302.rar" with this feature in case someone wants to test it.

---

I decided to use python3.8 for v49 and forwards because that's the best way to still have win7 support + biggest 32bit pip wheels support. Let's see what can be done with it.

Spoiler

Edited by Metin2 Dev International
Core X - External 2 Internal
  • Metin2 Dev 3
  • Love 2
Link to comment
https://metin2.dev/topic/2747-worldeditor-remix/page/15/#findComment-173470
Share on other sites

On 11/29/2025 at 4:01 AM, dewolution said:

Hello, am having issue that whenever i put my map into client and warp on the map .. i see buggy black screen with flickering textures when i look around. i tried to pack it again or save it again and i still having same problem .. any solution ? spacer.png

Check that you implemented it correctly. That looks like a problem loading the texture reset, with the terrain information.

Link to comment
https://metin2.dev/topic/2747-worldeditor-remix/page/15/#findComment-173475
Share on other sites

  • Active+ Member
On 12/10/2025 at 2:05 PM, martysama0134 said:

I decided to use python3.8 for v49 and forwards because that's the best way to still have win7 support + biggest 32bit pip wheels support. Let's see what can be done with it.

We are in 2026 almost. and at least win10. if it was a game, was understandable to keep old python compatibility with windows and other things. But, I consider, a professional guy who develops maps / its own server, it should be up to date with tools, using modern technologies. 

 

iM JUST AN IDIOT. DIDN'T READ THAT CORRECTLY. NVM

 

Edited by KolenMG
  • kekw 2
Link to comment
https://metin2.dev/topic/2747-worldeditor-remix/page/15/#findComment-173489
Share on other sites

For some reason it looks like creating a new map is broken since v47, if you try to create a new map using v47 and versions above, you end up with seemingly an "empty" map like this - all versions below v47 are working fine in this regard:

V47 and above

.png

V46 and below

.png

 

I have also noticed that despite typing a specific TextureSet name in the map creation window, it generates a TextureSet name based on the map folder name instead - this bug in particular is present in all WE versions that I have tried:

.png

.png

Edited by krupier0x
  • Smile Tear 1
  • Scream 1
Link to comment
https://metin2.dev/topic/2747-worldeditor-remix/page/15/#findComment-173520
Share on other sites

54 minutes ago, krupier0x said:

For some reason it looks like creating a new map is broken since v47, if you try to create a new map using v47 and versions above, you end up with seemingly an "empty" map like this - all versions below v47 are working fine in this regard:

V47 and above

.png

V46 and below

.png

 

I have also noticed that despite typing a specific TextureSet name in the map creation window, it generates a TextureSet name based on the map folder name instead - this bug in particular is present in all WE versions that I have tried:

.png

.png

yes sir i wanted to test it.

https://metin2.download/video/26Drl439nJ3AkY4yqusXpbA4sup76HXM/.mp4

well it sucks.

 

Quote

ScriptType    MapSetting

CellScale    200
HeightScale    0.500000

ViewRadius    128

MapSize    1    1
BasePosition    0    0
TerrainVisible    0
TextureSet    textureset\metin2_map_try.txt
Environment    
 

 

 

Edited by Metin2 Dev International
Core X - External 2 Internal
Link to comment
https://metin2.dev/topic/2747-worldeditor-remix/page/15/#findComment-173522
Share on other sites

19 minutes ago, Ace said:

Good catch, I didnt notice the TerrainVisible variable in the map setting. Not really sure why was it added by default in the V47 version onwards though.

Might be possibly related to that change note in the V47:

- fixed the TerrainVisible map option based on the "Terrain Out" checkbox

Edited by Metin2 Dev International
Core X - External 2 Internal
Link to comment
https://metin2.dev/topic/2747-worldeditor-remix/page/15/#findComment-173523
Share on other sites

7 minutes ago, krupier0x said:

Good catch, I didnt notice the TerrainVisible variable in the map setting. Not really sure why was it added by default in the v47 version onwards though.

do not worry, in v50 it's fixed you see

Spoiler

.png

 

  • Smile Tear 1
  • Good 1
Link to comment
https://metin2.dev/topic/2747-worldeditor-remix/page/15/#findComment-173524
Share on other sites

  • Honorable Member

V49 out!

List of python functions and constants:

Spoiler
WorldEditor Functions and Constants
=====================================

FUNCTIONS
=========

Map General
-----------
WorldEditor.IsMapReady() -> int
WorldEditor.GetSceneType() -> int
WorldEditor.GetBaseXY() -> (int, int)
WorldEditor.GetTerrainCount() -> (int, int)
WorldEditor.GetMapType() -> int
WorldEditor.GetEnvironmentDataName() -> str

Property
--------
WorldEditor.GetPropertyType(ext: int) -> str
WorldEditor.GetPropertyExtension(type: str) -> int
WorldEditor.GetObjectList() -> tuple

Camera
------
WorldEditor.GetTargetPosition() -> (float, float)
WorldEditor.UpdateTargetPosition(x: int, y: int) -> None
WorldEditor.GetCameraPosition() -> (float, float, float)
WorldEditor.GetCameraTarget() -> (float, float, float)
WorldEditor.SetCameraPosition(x: float, y: float, z: float) -> None
WorldEditor.SetCameraTarget(x: float, y: float, z: float) -> None

Map Draw
--------
WorldEditor.GetHeightPixel(x: int, y: int) -> int
WorldEditor.DrawHeightPixel(x: int, y: int, height: int) -> None

Terrain Utilities
-----------------
WorldEditor.GetHeightAt(x: float, y: float) -> int
WorldEditor.SetHeightAt(x: float, y: float, height: int) -> None
WorldEditor.GetTerrainSize() -> int
WorldEditor.WorldToTerrainCoords(x: float, y: float) -> (int, int, int, int)
WorldEditor.TerrainToWorldCoords(terrainNumX: int, terrainNumY: int, cellX: int, cellY: int) -> (int, int)

Map Information
--------------
WorldEditor.GetMapName() -> str
WorldEditor.IsMapLoaded() -> int
WorldEditor.GetMapBounds() -> (int, int, int, int)

Batch Operations
----------------
WorldEditor.DrawHeightRegion(x1: int, y1: int, x2: int, y2: int, height: int) -> None
WorldEditor.GetHeightRegion(x1: int, y1: int, x2: int, y2: int) -> list

Object Selection
----------------
WorldEditor.GetSelectedObjectCount() -> int
WorldEditor.GetSelectedObjectName() -> str
WorldEditor.SelectObject(index: int) -> None
WorldEditor.SelectObjectsByRect(x1: float, y1: float, x2: float, y2: float) -> int
WorldEditor.CancelSelect() -> None
WorldEditor.IsObjectSelected(index: int) -> int
WorldEditor.GetPickedObjectIndex() -> int

Object Manipulation
-------------------
WorldEditor.GetObjectCount() -> int
WorldEditor.GetObjectData(index: int) -> (float, float, float, int, float, float, float)
WorldEditor.MoveSelectedObject(x: float, y: float) -> None
WorldEditor.MoveSelectedObjectHeight(height: float) -> None
WorldEditor.ResetSelectedObjectHeightToTerrain() -> None
WorldEditor.RotateSelectedObject(yaw: float, pitch: float, roll: float) -> None
WorldEditor.SetSelectedObjectRotation(yaw: float, pitch: float, roll: float) -> None
WorldEditor.RotateSelectedObjectAroundPivot(rollDeg: float) -> None
WorldEditor.DeleteSelectedObject() -> None
WorldEditor.DeleteObjectsByCRCList(crcList: list, scope: int = 1) -> int
WorldEditor.ReplaceObjectsByCRC(sourceCrc: int, targetCrc: int, scope: int = 1) -> int
WorldEditor.InsertObject(x: float, y: float, z: float, yaw: float, pitch: float, roll: float, scale: int, crc: int) -> None
WorldEditor.PlaceGrassPropsByTexture(textureIds: list, grassCrcs: list, minDistanceMeters: float = 10.0) -> (int, int)
WorldEditor.GetSelectionPivot() -> (float, float, float)

Object Portal
-------------
WorldEditor.SetSelectedObjectPortalNumber(portalID: int) -> None
WorldEditor.DelSelectedObjectPortalNumber(portalID: int) -> None
WorldEditor.GetSelectedObjectPortalNumbers() -> list

Attribute Manipulation
----------------------
WorldEditor.GetAttrAt(x: float, y: float) -> int
WorldEditor.SetAttrAt(x: float, y: float, attrFlag: int) -> None
WorldEditor.IsAttrOn(x: float, y: float, attrFlag: int) -> int
WorldEditor.DrawAttrBrush(x: float, y: float, attrFlag: int, brushSize: int, erase: int) -> None
WorldEditor.GetSelectedAttrFlag() -> int
WorldEditor.SetSelectedAttrFlag(attrFlag: int) -> None
WorldEditor.ResetToDefaultAttr() -> int

Refresh Functions
-----------------
WorldEditor.RefreshArea() -> None
WorldEditor.RefreshSelectedInfo() -> None
WorldEditor.RefreshObjectHeight(x: float, y: float, halfSize: float) -> None
WorldEditor.RefreshTerrain() -> None
WorldEditor.RefreshEnvironment() -> None
WorldEditor.ReloadMap() -> int

Save Functions
----------------
WorldEditor.SaveMap(mapName: str = None) -> int
WorldEditor.SaveMapProperty() -> int
WorldEditor.SaveMapSetting() -> int
WorldEditor.SaveTerrains() -> int
WorldEditor.SaveAreas() -> int

Utility Functions
-----------------
WorldEditor.GetObjectDataCount() -> int
WorldEditor.GetEditArea() -> (int, int, int, int, int, int)
WorldEditor.SetBrushSize(size: int) -> None
WorldEditor.GetBrushSize() -> int
WorldEditor.SetBrushStrength(strength: int) -> None
WorldEditor.GetBrushStrength() -> int
WorldEditor.CopySelectedObjects() -> None
WorldEditor.PasteObjects(x: float, y: float, z: float) -> None
WorldEditor.SetWireframe(enabled: int) -> None
WorldEditor.IsWireframe() -> int

Water Functions
---------------
WorldEditor.GetWaterHeight(x: float, y: float) -> int
WorldEditor.DrawWaterBrush(x: float, y: float, waterHeight: int, brushSize: int, erase: int) -> None
WorldEditor.SetAllWaterHeight(height: int) -> None
WorldEditor.GetBrushWaterHeight() -> int
WorldEditor.SetBrushWaterHeight(height: int) -> None
WorldEditor.SetEraseWater(enabled: int) -> None
WorldEditor.PreviewEditWater() -> None

Height Brush Functions
----------------------
WorldEditor.DrawHeightBrush(x: float, y: float, brushShape: int, brushType: int, brushSize: int, brushStrength: int) -> None
WorldEditor.SetBrushShape(shape: int) -> None
WorldEditor.GetBrushShape() -> int
WorldEditor.SetBrushType(type: int) -> None
WorldEditor.GetBrushType() -> int
WorldEditor.SetBrushSizeY(size: int) -> None
WorldEditor.GetBrushSizeY() -> int
WorldEditor.SetMaxBrushSize(size: int) -> None
WorldEditor.SetMaxBrushStrength(strength: int) -> None

Texture Brush Functions
-----------------------
WorldEditor.DrawTextureBrush(x: float, y: float, textureList: list, brushSize: int, erase: int, drawOnlyOnBlankTile: int) -> None
WorldEditor.SetEraseTexture(enabled: int) -> None
WorldEditor.SetDrawOnlyOnBlankTile(enabled: int) -> None
WorldEditor.AddTerrainTexture(filename: str) -> int
WorldEditor.RemoveTerrainTexture(texNum: int) -> int
WorldEditor.ResetTerrainTexture() -> None
WorldEditor.InitBaseTexture(mapName: str = None) -> int

Environment and Lighting Functions
----------------------------------
WorldEditor.SetLightDirection(x: float, y: float, z: float) -> None
WorldEditor.SetLightDiffuseColor(r: float, g: float, b: float) -> None
WorldEditor.SetLightAmbientColor(r: float, g: float, b: float) -> None
WorldEditor.EnableLight(enabled: int) -> None
WorldEditor.SetFogColor(r: float, g: float, b: float) -> None
WorldEditor.SetFogNearDistance(distance: float) -> None
WorldEditor.SetFogFarDistance(distance: float) -> None
WorldEditor.EnableFog(enabled: int) -> None
WorldEditor.SetWindStrength(strength: float) -> None
WorldEditor.SetWindRandom(random: float) -> None
WorldEditor.EnableWind(enabled: int) -> None

Material Functions
-----------------
WorldEditor.SetMaterialDiffuseColor(r: float, g: float, b: float) -> None
WorldEditor.SetMaterialAmbientColor(r: float, g: float, b: float) -> None
WorldEditor.SetMaterialEmissiveColor(r: float, g: float, b: float) -> None

Filtering Functions
-------------------
WorldEditor.SetFilteringColor(r: float, g: float, b: float) -> None
WorldEditor.SetFilteringAlpha(alpha: float) -> None
WorldEditor.SetFilteringAlphaSrc(src: int) -> None
WorldEditor.SetFilteringAlphaDest(dest: int) -> None
WorldEditor.EnableFiltering(enabled: int) -> None

Editing Mode Functions
----------------------
WorldEditor.SetHeightEditing(enabled: int) -> None
WorldEditor.IsHeightEditing() -> int
WorldEditor.SetTextureEditing(enabled: int) -> None
WorldEditor.IsTextureEditing() -> int
WorldEditor.SetWaterEditing(enabled: int) -> None
WorldEditor.IsWaterEditing() -> int
WorldEditor.SetAttrEditing(enabled: int) -> None
WorldEditor.IsAttrEditing() -> int
WorldEditor.SetMonsterAreaInfoEditing(enabled: int) -> None
WorldEditor.IsMonsterAreaInfoEditing() -> int
WorldEditor.EditingStart() -> None
WorldEditor.EditingEnd() -> None
WorldEditor.SetEraseAttr(enabled: int) -> None

Undo/Redo Functions
-------------------
WorldEditor.BackupObject() -> None
WorldEditor.BackupTerrain() -> None
WorldEditor.BackupObjectCurrent() -> None
WorldEditor.BackupTerrainCurrent() -> None
WorldEditor.Undo() -> None
WorldEditor.Redo() -> None
WorldEditor.CanUndo() -> int
WorldEditor.CanRedo() -> int
WorldEditor.GetUndoCount() -> int
WorldEditor.GetRedoCount() -> int
WorldEditor.ClearUndoBuffer() -> None

Map Creation Functions
---------------------
WorldEditor.NewMap(mapName: str) -> int
WorldEditor.CreateNewOutdoorMap() -> int
WorldEditor.SetNewMapName(name: str) -> None
WorldEditor.SetNewMapSizeX(size: int) -> None
WorldEditor.SetNewMapSizeY(size: int) -> None
WorldEditor.GetTerrainNum(x: float, y: float) -> int
WorldEditor.GetEditTerrainNum() -> int

Shadow Functions
----------------
WorldEditor.UpdateTerrainShadowMap() -> None
WorldEditor.ReloadTerrainShadowTexture() -> None
WorldEditor.DestroyShadowTexture() -> None
WorldEditor.RecreateShadowTexture() -> None

Minimap Functions
-----------------
WorldEditor.SaveMiniMap() -> None
WorldEditor.SaveAtlas() -> None

Monster Area Functions
----------------------
WorldEditor.ShowAllMonsterAreaInfo(enabled: int) -> None
WorldEditor.IsShowAllMonsterAreaInfo() -> int
WorldEditor.SaveMonsterAreaInfo() -> int
WorldEditor.GetMonsterAreaInfoCount() -> int
WorldEditor.GetSelectedMonsterAreaInfo() -> int
WorldEditor.SelectNextMonsterAreaInfo(forward: int = 1) -> None
WorldEditor.SelectMonsterAreaInfoStart() -> None
WorldEditor.SelectMonsterAreaInfoEnd() -> None
WorldEditor.IsSelectMonsterAreaInfoStarted() -> int
WorldEditor.AddNewMonsterAreaInfo(originX: int, originY: int, sizeX: int, sizeY: int, type: int, vid: int, count: int, dir: int) -> int
WorldEditor.RemoveMonsterAreaInfoPtr(index: int) -> int
WorldEditor.SetMonsterNames() -> None

Cursor Functions
----------------
WorldEditor.SetEditingCursorPosition(x: float, y: float, z: float) -> None
WorldEditor.GetEditingCursorPosition() -> (float, float, float)
WorldEditor.GetPickingCoordinate() -> (float, float, float, int, int, int, int, int, int) or tuple
WorldEditor.GetPickingCoordinateWithRay(rayOriginX: float, rayOriginY: float, rayOriginZ: float, rayDirX: float, rayDirY: float, rayDirZ: float) -> (float, float, float, int, int, int, int, int, int) or tuple

Auto-Save Functions
-------------------
WorldEditor.SetAutoSave(enabled: int) -> None
WorldEditor.IsAutoSave() -> int
WorldEditor.SetAutoBackup(enabled: int) -> None
WorldEditor.IsAutoBackup() -> int
WorldEditor.GetTimeSave() -> int
WorldEditor.SetNextTimeSave() -> None

Portal Functions
----------------
WorldEditor.EnablePortal(enabled: int) -> None
WorldEditor.IsSelected() -> int

Object Ambience Functions
-------------------------
WorldEditor.AddSelectedAmbienceScale(addScale: int) -> None
WorldEditor.AddSelectedAmbienceMaxVolumeAreaPercentage(percentage: float) -> None

Environment Script Functions
-----------------------------
WorldEditor.LoadEnvironmentScript(filename: str) -> None
WorldEditor.SaveEnvironmentScript(filename: str) -> None
WorldEditor.InitializeEnvironmentData() -> None
WorldEditor.RefreshScreenFilter() -> None
WorldEditor.RefreshSkyBox() -> None
WorldEditor.RefreshLensFlare() -> None

Skybox Functions
----------------
WorldEditor.SetSkyBoxTextureRenderMode(enabled: int) -> None
WorldEditor.IsSkyBoxTextureRenderMode() -> int
WorldEditor.SetSkyBoxFaceTexture(filename: str, faceIndex: int) -> None
WorldEditor.GetSkyBoxFaceTexture(faceIndex: int) -> str
WorldEditor.GetSkyBoxScale() -> (float, float, float)
WorldEditor.SetSkyBoxScale(x: float, y: float, z: float) -> None
WorldEditor.GetSkyBoxCloudScale() -> (float, float)
WorldEditor.SetSkyBoxCloudScale(x: float, y: float) -> None
WorldEditor.GetSkyBoxCloudTextureScale() -> (float, float)
WorldEditor.SetSkyBoxCloudTextureScale(x: float, y: float) -> None
WorldEditor.GetSkyBoxCloudSpeed() -> (float, float)
WorldEditor.SetSkyBoxCloudSpeed(x: float, y: float) -> None
WorldEditor.GetSkyBoxCloudHeight() -> float
WorldEditor.SetSkyBoxCloudHeight(height: float) -> None
WorldEditor.GetSkyBoxCloudTextureFileName() -> str
WorldEditor.SetSkyBoxCloudTextureFileName(filename: str) -> None
WorldEditor.GetSkyBoxGradientUpper() -> int
WorldEditor.SetSkyBoxGradientUpper(value: int) -> None
WorldEditor.GetSkyBoxGradientLower() -> int
WorldEditor.SetSkyBoxGradientLower(value: int) -> None
WorldEditor.InsertGradientUpper() -> None
WorldEditor.InsertGradientLower() -> None
WorldEditor.DeleteGradient(index: int) -> None

Lensflare Functions
-------------------
WorldEditor.GetLensFlareEnable() -> int
WorldEditor.SetLensFlareEnable(enabled: int) -> None
WorldEditor.GetLensFlareBrightnessColor() -> (float, float, float, float)
WorldEditor.SetLensFlareBrightnessColor(r: float, g: float, b: float, a: float) -> None
WorldEditor.GetLensFlareMaxBrightness() -> float
WorldEditor.SetLensFlareMaxBrightness(brightness: float) -> None
WorldEditor.GetMainFlareEnable() -> int
WorldEditor.SetMainFlareEnable(enabled: int) -> None
WorldEditor.GetMainFlareTextureFileName() -> str
WorldEditor.SetMainFlareTextureFileName(filename: str) -> None
WorldEditor.GetMainFlareSize() -> float
WorldEditor.SetMainFlareSize(size: float) -> None

Additional Utility Functions
-----------------------------
WorldEditor.GetMapID() -> int
WorldEditor.SetMapID(id: int) -> None
WorldEditor.ToggleWireframe() -> None
WorldEditor.RenderSelectedObject() -> None
WorldEditor.RenderAttr() -> None
WorldEditor.RenderObjectCollision() -> None
WorldEditor.UpdateEditing() -> None
WorldEditor.PreloadAllTerrainsAndAreas() -> int
WorldEditor.UpdateMapInfo() -> None
WorldEditor.UpdateBaseMapInfo(baseX: int, baseY: int) -> int
WorldEditor.CloseMap() -> None
WorldEditor.GetEditTerrain() -> int
WorldEditor.SetTerrainModified() -> None
WorldEditor.GetLastPickedAreaIndex() -> int
WorldEditor.SetLastPickedAreaIndex(index: int) -> None
WorldEditor.IsIntersectingSelection(index: int) -> int
WorldEditor.GetNumWater() -> int
WorldEditor.SetNumWater(num: int) -> None
WorldEditor.GetWaterHeightArray() -> list
WorldEditor.SetWaterHeightArray(waterList: list) -> None
WorldEditor.GetSplatValue() -> float
WorldEditor.SetSplatValue(value: float) -> None
WorldEditor.PreloadTerrainAndArea(terrainCoordX: int, terrainCoordY: int) -> None
WorldEditor.ArrangeTerrainHeight() -> None
WorldEditor.GetTerrainNumFromCoord(terrainNumX: int, terrainNumY: int) -> int
WorldEditor.RAW_ResetTextures() -> None
WorldEditor.GetTerrainTextureFilename(texIndex: int) -> str
WorldEditor.GetTerrainUsedTextures(terrainNumX: int, terrainNumY: int) -> list
WorldEditor.GetTerrainWorldBounds(terrainNumX: int, terrainNumY: int) -> (int, int, int, int)
WorldEditor.GetTileValueAt(x: float, y: float) -> int
WorldEditor.SetAttrAtWorld(x: float, y: float, attrFlag: int) -> None
WorldEditor.ApplyAttrToTerrainByTile(terrainNumX: int, terrainNumY: int, textureIds: list, attrFlag: int) -> int
WorldEditor.RefreshAllTerrainAttrs() -> int
WorldEditor.CleanupWaterWithoutAttr() -> (int, int, int, int, int, int, int)
WorldEditor.GetLastSelectedObjectData() -> dict
WorldEditor.AccumulateSelectionPivot() -> (float, float, float)
WorldEditor.CollectPortalNumber() -> list
WorldEditor.ClearSelectedPortalNumber() -> None
WorldEditor.SetSelectedObjectName(name: str) -> None
WorldEditor.CopySelectedObjectsToClipboard() -> None
WorldEditor.PasteObjectsFromClipboard(x: float, y: float, z: float) -> None
WorldEditor.GetSelectedObjectPortalVectorRef() -> list
WorldEditor.RenderAccessorTerrain(renderMode: int, attrFlag: int) -> None
WorldEditor.RenderToShadowMap() -> None
WorldEditor.RenderShadow() -> None
WorldEditor.RenderMiniMap() -> None
WorldEditor.SetTextureBrushVector(textureList: list) -> None
WorldEditor.SetInitTextureBrushVector(textureList: list) -> None
WorldEditor.ReloadTerrainTextures() -> None
WorldEditor.ReloadBuildingTexture() -> None


CONSTANTS
=========

Scene Type Constants
--------------------
WorldEditor.SCENE_MAP
WorldEditor.SCENE_OBJECT
WorldEditor.SCENE_EFFECT
WorldEditor.SCENE_FLY
WorldEditor.SCENE_MAX

Map Type Constants
------------------
WorldEditor.MAPTYPE_INVALID
WorldEditor.MAPTYPE_INDOOR
WorldEditor.MAPTYPE_OUTDOOR

Property Type Constants
-----------------------
WorldEditor.PROPERTY_TYPE_NONE
WorldEditor.PROPERTY_TYPE_TREE
WorldEditor.PROPERTY_TYPE_BUILDING
WorldEditor.PROPERTY_TYPE_EFFECT
WorldEditor.PROPERTY_TYPE_AMBIENCE
WorldEditor.PROPERTY_TYPE_DUNGEON_BLOCK
WorldEditor.PROPERTY_TYPE_MAX_NUM

Terrain Constants
-----------------
WorldEditor.TERRAIN_SIZE
WorldEditor.TERRAIN_PATCHSIZE
WorldEditor.TERRAIN_PATCHCOUNT
WorldEditor.MAXTERRAINTEXTURES
WorldEditor.MAPBASE

Brush Shape Constants
---------------------
WorldEditor.BRUSH_SHAPE_NONE
WorldEditor.BRUSH_SHAPE_CIRCLE
WorldEditor.BRUSH_SHAPE_SQUARE
WorldEditor.BRUSH_SHAPE_MAX

Brush Type Constants
--------------------
WorldEditor.BRUSH_TYPE_NONE
WorldEditor.BRUSH_TYPE_UP
WorldEditor.BRUSH_TYPE_DOWN
WorldEditor.BRUSH_TYPE_PLATEAU
WorldEditor.BRUSH_TYPE_NOISE
WorldEditor.BRUSH_TYPE_SMOOTH
WorldEditor.BRUSH_TYPE_MAX

Boundary Load Constants
---------------------
WorldEditor.BOUNDARY_LOAD_INVALID
WorldEditor.BOUNDARY_LOAD_NOBOUNDARY
WorldEditor.BOUNDARY_LOAD_TOPLEFT
WorldEditor.BOUNDARY_LOAD_TOP
WorldEditor.BOUNDARY_LOAD_TOPRIGHT
WorldEditor.BOUNDARY_LOAD_LEFT
WorldEditor.BOUNDARY_LOAD_RIGHT
WorldEditor.BOUNDARY_LOAD_BOTTOMLEFT
WorldEditor.BOUNDARY_LOAD_BOTTOM
WorldEditor.BOUNDARY_LOAD_BOTTOMRIGHT
WorldEditor.BOUNDARY_LOAD_ALLBOUNDARY

Monster Area Type Constants
----------------------------
WorldEditor.MONSTERAREAINFOTYPE_INVALID
WorldEditor.MONSTERAREAINFOTYPE_MONSTER
WorldEditor.MONSTERAREAINFOTYPE_GROUP

Monster Direction Constants
----------------------------
WorldEditor.MONSTER_DIR_RANDOM
WorldEditor.MONSTER_DIR_NORTH
WorldEditor.MONSTER_DIR_NORTHEAST
WorldEditor.MONSTER_DIR_EAST
WorldEditor.MONSTER_DIR_SOUTHEAST
WorldEditor.MONSTER_DIR_SOUTH
WorldEditor.MONSTER_DIR_SOUTHWEST
WorldEditor.MONSTER_DIR_WEST
WorldEditor.MONSTER_DIR_NORTHWEST

Additional Constants
--------------------
WorldEditor.AROUND_AREA_NUM
WorldEditor.MAX_WATER_NUM
WorldEditor.ENV_DIRLIGHT_BACKGROUND
WorldEditor.TILEMAP_RAW_XSIZE
WorldEditor.TILEMAP_RAW_YSIZE
WorldEditor.ATTRMAP_XSIZE
WorldEditor.ATTRMAP_YSIZE
WorldEditor.CELLSCALE_IN_METER
WorldEditor.HALF_CELLSCALE_IN_METER
WorldEditor.ATTRIBUTE_BLOCK
WorldEditor.ATTRIBUTE_WATER
WorldEditor.ATTRIBUTE_BANPK

 

 

Edited by Metin2 Dev International
Core X - External 2 Internal
  • Metin2 Dev 1
  • muscle 1
  • Love 1
  • Love 11
Link to comment
https://metin2.dev/topic/2747-worldeditor-remix/page/15/#findComment-173576
Share on other sites

  • 2 weeks later...

Compas.dss Reworked

If anyone needs it, they can use it.
It is not the best design, but it is currently the only one available.
The PSD files are included, so you can edit them yourself.
And if there are any errors, I apologize, everything works perfectly for me

Screen: 

.jpg

Download: 

This is the hidden content, please

 

Extra:

Spoiler

Extra Download: Helper

Helper is a small utility tool written with the assistance of ChatGPT.
It provides three practical features that are especially useful when working with maps and objects:

1. Creating empty MDATR files for objects

1. Converting GR2 file extensions to lowercase

1. Enabling and disabling map folders to reduce lag while editing

1. Creating Empty MDATR Files

I created a large number of objects, and most of them such as rocks and stones should not have collision generated via Autodesk.
Instead, their collision is configured manually in the ATTR Editor.

Because of this, I constantly had to export empty MDATR files using Autodesk.
When dealing with hundreds or even thousands of objects, this quickly became very time-consuming.

With Helper, this process is much simpler.
You simply drag the folder containing your objects onto the Helper executable and select option 1.
The tool will automatically generate an MDATR file for each object, matching the object’s filename.

Helper uses an internal file called file.mdatr.
This file is completely empty and has no impact on the game itself.

2. Converting GR2 Extensions to Lowercase

This feature works the same way as the first one.
Drag the folder onto the Helper executable and enter option 2.

Autodesk exports files with the extension GR2 in uppercase.
While this can be changed manually, I personally found it annoying to deal with and preferred an automated solution.

Helper converts all GR2 extensions to lowercase gr2 in one step.

3. Enabling and Disabling Map Folders

This feature currently works reliably with maps up to 9×9 in size.
Larger maps may require small adjustments in the code.

When editing maps, performance often degrades over time.
Reloading the map helps temporarily, but the lag usually returns, and crashes can still occur after extended editing sessions.

To solve this, Helper allows you to work only on the specific map area you are currently editing, while disabling all others.

Inside the map folder, you will see directories such as 000000, 001001, 000001, and so on.
In the WorldEditor, these correspond to the coordinates shown in the bottom-right corner, such as 0/1, 2/1, or 1/2.

These values represent the exact coordinates of the map folders.

You drag your map folder onto the Helper executable and enter the same coordinates you see in the WorldEditor.
All other areas will be disabled automatically.

After reloading the map, only the selected area will contain objects, shadows, and minimap data.
This significantly improves performance while working.

If you want to re-enable all areas, simply enter the same coordinates again in Helper and confirm the action.
Reload the map, and everything will be restored to its original state.

What You Can Do Safely

You can save the map while working on a single active area.
You can also generate new shadows or minimap data for that area.
None of these actions will affect the disabled folders.

Important Warning

It is strongly recommended to close the WorldEditor and reload the map once you want to see all objects again.
If you save the map while all areas are visible again without restarting, you risk losing data.

Video:

Download-SRC: 

This is the hidden content, please

 

 

Edited by Ace
  • Metin2 Dev 6
  • Flame 1
  • Love 4
Link to comment
https://metin2.dev/topic/2747-worldeditor-remix/page/15/#findComment-173711
Share on other sites

Don't use any images from : imgur, turkmmop, freakgamers, inforge, hizliresim... Or your content will be deleted without notice...
Use : https://metin2.download/media/add/

Please use https://metin2.download/ when uploading files smaller than 100MB, otherwise the approval will take longer due to manual upload.

Please sign in to comment

You will be able to leave a comment after signing in



Sign In Now
×
×
  • Create New...

Important Information

Terms of Use / Privacy Policy / Guidelines / We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.