• There is NO official Otland's Discord server and NO official Otland's server list. The Otland's Staff does not manage any Discord server or server list. Moderators or administrator of any Discord server or server lists have NO connection to the Otland's Staff. Do not get scammed!

Athena Editor Development Thread

Looks really good. I'm a huge fan of C# so I'll try to follow this. Some notes, by the way, you say the requirements are .NET 4.6.3, but it's actually 4.6.2. I had to install the Developer Pack version of .NET 4.6.2 to not get a framework-targeting error.

Also, when loading the solution file in Visual Studio 2015, it tries to load Performance1.psess (a performance profiler file) and an Overview.modelproj file (a quick Google search says this is only compatible with Ultimate versions of Visual Studio). Neither of these are present so Visual Studio gets angry and throws errors at you. These aren't necessary to include, so a simple edit to the solution file will fix that.

When building, I get an error that a xcopy command exited with code 4. Upon inspection, I found that the path is hardcoded in the MapEditorWPF.csproj file here. This will obviously need to be fixed.

After all that, I was finally able to build the project successfully only to launch the executable and be greeted with an interface that basically did nothing (yes, I moved all necessary files to the output folder). At this point I didn't really feel like jumping into the code to debug it and see what was going on.

Thanks for trying it out, I will do a clone in a different location and try to fix the build issues you are seeing.
 
Alright the build issues should be fixed. The ItemsToPutInOutputFolders was outdated. I honestly didn't expect people to try building it, pleasantly surprised :) I'm a little annoyed that absolute path was in there, that was all auto generated from NuGet. Should be all fixed now tho. The other thing, you need to put the 10.98 tibia.spr in the Version Data folder under 10.98 in your output directory. I couldn't commit that file, it was too big for github's limits. Although I can't be too annoyed with NuGet. I am being very sloppy with my commits. I shouldn't have the packages commited at all and they should have to re downloaded when you checkout.
 
Last edited:
Alright the build issues should be fixed. The ItemsToPutInOutputFolders was outdated. I honestly didn't expect people to try building it, pleasantly surprised :) I'm a little annoyed that absolute path was in there, that was all auto generated from NuGet. Should be all fixed now tho. The other thing, you need to put the 10.98 tibia.spr in the Version Data folder under 10.98 in your output directory. I couldn't commit that file, it was too big for github's limits. Although I can't be too annoyed with NuGet. I am being very sloppy with my commits. I shouldn't have the packages commited at all and they should have to re downloaded when you checkout.

.gitignore is your friend :)
 
Last edited:
Btw, I can't invest much time in contributing to this project but I can easily build and test it out.

Let us know when you have some milestone releases so us interested folks can grab, test and submit feedback.

Awesome job so far!
 
To add on to what @downloadnow said, if you have a todo list, that would be interesting to look at. Especially if someone wanted to contribute. Also, if you're interested, I'd be willing to do some code review. C++ is my main language, but I also work with C#.
 
The code needs some clean up for sure :eek:
Judge all you want, I don't claim that the code is perfect right now. There is a reason its a development thread and not a release version. I've rushed through the versioning system, I'm perfectly aware of that. I'm referencing things globally I shouldn't be and the end goal is to be able to have multiple versions loaded simultaneously. That's going to require 3 or 4 days of refactoring. With all of that said, the brush and tool system is strong. That is where I've spent my time and in my opinion is a lot cleaner / a lot more extensible than the backbone of remeres. Perhaps you don't agree, but that's okay, your not the one developing it.

I don't want to sound mean, but if all you have is criticism, screw you. Its not constructive, if you want to comment on a specific area, or offer suggestions that's fine. But just generalizing the entire project as shit, is pretty demeaning. I spend my free time on this, I don't have 8 hours a day, 40 days a week to have everything perfect.


To add on to what @downloadnow said, if you have a todo list, that would be interesting to look at. Especially if someone wanted to contribute. Also, if you're interested, I'd be willing to do some code review. C++ is my main language, but I also work with C#.

When I am more at release point I'll let you know. Theres areas in this code, mainly how I'm dealing with version that I want to refactor before anyone seriously judges the code. And no this isn't my first project, I work on C# professionally. But with the limited time I'm spending on this project I'm rushing through aspects that I would otherwise spend more time on.
 
Last edited:
I'm saying honestly that if you're going to develop it further I can see it being the standard map editor instead of RME in the near future.
Have you got any documentation on otbm and otb structure by the way? I've learned most of it by reverse engineering and from rme/otc sources but I'm not sure about few things.
 
I'm saying honestly that if you're going to develop it further I can see it being the standard map editor instead of RME in the near future.
Have you got any documentation on otbm and otb structure by the way? I've learned most of it by reverse engineering and from rme/otc sources but I'm not sure about few things.
Thanks, and no all of my understanding of those formats has been from looking at either RME or other programs that load them. I haven't found any actual documentation.
 
I feel obligated to provide a more detailed response to people suggesting my code is in disarray. I don't want the average observer who doesn't have the knowledge or will to look at the source code himself think that this project is failing or will fail from a bad code base.

Architectural overview of map control and brushes:
The application 2 main elements, the brush window, and the map control.

I will be focusing on the architecture of the map control and the brushes.

The MapControl is the control that contains the map renderer and handles the transforms from pixel coordinates to map coordinates.
The mapcontrol contains a list of Tools. A tool is a class that you feed all your mouse and keyboards events to and it figures out what happened and calls virtual members. Basically you feed it in MouseMove, MouseDown, MouseUp, and it will generate a drag start, drag change, drag end, and similar events.

The tool class works very much like a UI click event would in terms of falling through. If one tool handles an event, the next tool will not receive it. This allows me to have a MapMovementTool that handles just the logic for moving a map around, and not have to worry about any other tools that may conflict with it. This allows my brush code to be separated from my map movement code, and abstracts out any drag detection code I might have.
This allows me to have a short cuts in all of my brushes without having a long if statements and worrying about collisions in the base MapControl.

To provide some examples I will use Remeres as a contrast. I am using comparing against remeres, because that is what we currently have, not because I think its a model that should be followed. And not because "my code must be good if its better than Remeres".

If we look at a practical example of a MouseClick event.

Remeres
If you notice, he is handling everything from selection, to starting his drag events, to handling specific logic for wall brushes and ground brushes all in one function in his map_display control which seems to be the equivalent to my mapcontrol.

C++:
void MapCanvas::OnMouseActionClick(wxMouseEvent& event)
{
    SetFocus();

    int mouse_map_x, mouse_map_y;
    ScreenToMap(event.GetX(), event.GetY(), &mouse_map_x, &mouse_map_y);

    if(event.ControlDown() && event.AltDown()) {
        Tile* tile = editor.map.getTile(mouse_map_x, mouse_map_y, floor);
        if(tile && tile->size() > 0) {
            Item* item = tile->getTopItem();
            if(item && item->getRAWBrush())
                g_gui.SelectBrush(item->getRAWBrush(), TILESET_RAW);
        }
    } else if(g_gui.IsSelectionMode()) {
        if(isPasting()) {
            // Set paste to false (no rendering etc.)
            EndPasting();

            // Paste to the map
            editor.copybuffer.paste(editor, Position(mouse_map_x, mouse_map_y, floor));

            // Start dragging
            dragging = true;
            drag_start_x = mouse_map_x;
            drag_start_y = mouse_map_y;
            drag_start_z = floor;
        } else do {
            boundbox_selection = false;
            if(event.ShiftDown()) {
                boundbox_selection = true;

                if(!event.ControlDown()) {
                    editor.selection.start(); // Start selection session
                    editor.selection.clear(); // Clear out selection
                    editor.selection.finish(); // End selection session
                    editor.selection.updateSelectionCount();
                }
            } else if(event.ControlDown()) {
                Tile* tile = editor.map.getTile(mouse_map_x, mouse_map_y, floor);
                if(tile) {
                    if(tile->spawn && g_settings.getInteger(Config::SHOW_SPAWNS)) {
                        editor.selection.start(); // Start selection session
                        if(tile->spawn->isSelected()) {
                            editor.selection.remove(tile, tile->spawn);
                        } else {
                            editor.selection.add(tile, tile->spawn);
                        }
                        editor.selection.finish(); // Finish selection session
                        editor.selection.updateSelectionCount();
                    } else if(tile->creature && g_settings.getInteger(Config::SHOW_CREATURES)) {
                        editor.selection.start(); // Start selection session
                        if(tile->creature->isSelected()) {
                            editor.selection.remove(tile, tile->creature);
                        } else {
                            editor.selection.add(tile, tile->creature);
                        }
                        editor.selection.finish(); // Finish selection session
                        editor.selection.updateSelectionCount();
                    } else {
                        Item* item = tile->getTopItem();
                        if(item) {
                            editor.selection.start(); // Start selection session
                            if(item->isSelected()) {
                                editor.selection.remove(tile, item);
                            } else {
                                editor.selection.add(tile, item);
                            }
                            editor.selection.finish(); // Finish selection session
                            editor.selection.updateSelectionCount();
                        }
                    }
                }
            } else {
                Tile* tile = editor.map.getTile(mouse_map_x, mouse_map_y, floor);
                if(!tile) {
                    editor.selection.start(); // Start selection session
                    editor.selection.clear(); // Clear out selection
                    editor.selection.finish(); // End selection session
                    editor.selection.updateSelectionCount();
                } else if(tile->isSelected()) {
                    dragging = true;
                    drag_start_x = mouse_map_x;
                    drag_start_y = mouse_map_y;
                    drag_start_z = floor;
                } else {
                    editor.selection.start(); // Start a selection session
                    editor.selection.clear();
                    editor.selection.commit();
                    if(tile->spawn && g_settings.getInteger(Config::SHOW_SPAWNS)) {
                        editor.selection.add(tile, tile->spawn);
                        dragging = true;
                        drag_start_x = mouse_map_x;
                        drag_start_y = mouse_map_y;
                        drag_start_z = floor;
                    } else if(tile->creature && g_settings.getInteger(Config::SHOW_CREATURES)) {
                        editor.selection.add(tile, tile->creature);
                        dragging = true;
                        drag_start_x = mouse_map_x;
                        drag_start_y = mouse_map_y;
                        drag_start_z = floor;
                    } else {
                        Item* item = tile->getTopItem();
                        if(item) {
                            editor.selection.add(tile, item);
                            dragging = true;
                            drag_start_x = mouse_map_x;
                            drag_start_y = mouse_map_y;
                            drag_start_z = floor;
                        }
                    }
                    editor.selection.finish(); // Finish the selection session
                    editor.selection.updateSelectionCount();
                }
            }
        } while(false);
    } else if(g_gui.GetCurrentBrush()) { // Drawing mode
        Brush* brush = g_gui.GetCurrentBrush();
        if(event.ShiftDown() && brush->canDrag()) {
            dragging_draw = true;
        } else {
            if(g_gui.GetBrushSize() == 0 && !brush->oneSizeFitsAll()) {
                drawing = true;
            } else {
                drawing = g_gui.GetCurrentBrush()->canSmear();
            }
            if(brush->isWall()) {
                if(event.AltDown() && g_gui.GetBrushSize() == 0) {
                    // z0mg, just clicked a tile, shift variaton.
                    if(event.ControlDown()) {
                        editor.undraw(Position(mouse_map_x, mouse_map_y, floor), event.AltDown());
                    } else {
                        editor.draw(Position(mouse_map_x, mouse_map_y, floor), event.AltDown());
                    }
                } else {
                    PositionVector tilestodraw;
                    PositionVector tilestoborder;

                    int start_map_x = mouse_map_x - g_gui.GetBrushSize();
                    int start_map_y = mouse_map_y - g_gui.GetBrushSize();
                    int end_map_x   = mouse_map_x + g_gui.GetBrushSize();
                    int end_map_y   = mouse_map_y + g_gui.GetBrushSize();

                    for(int y = start_map_y -1; y <= end_map_y + 1; ++y) {
                        for(int x = start_map_x - 1; x <= end_map_x + 1; ++x) {
                            if((x <= start_map_x+1 || x >= end_map_x-1) || (y <= start_map_y+1 || y >= end_map_y-1)) {
                                tilestoborder.push_back(Position(x,y,floor));
                            }
                            if(((x == start_map_x || x == end_map_x) || (y == start_map_y || y == end_map_y)) &&
                                ((x >= start_map_x && x <= end_map_x) && (y >= start_map_y && y <= end_map_y))) {
                                tilestodraw.push_back(Position(x,y,floor));
                            }
                        }
                    }
                    if(event.ControlDown()) {
                        editor.undraw(tilestodraw, tilestoborder, event.AltDown());
                    } else {
                        editor.draw(tilestodraw, tilestoborder, event.AltDown());
                    }
                }
            } else if(brush->isDoor()) {
                PositionVector tilestodraw;
                PositionVector tilestoborder;

                tilestodraw.push_back(Position(mouse_map_x, mouse_map_y, floor));

                tilestoborder.push_back(Position(mouse_map_x    , mouse_map_y - 1, floor));
                tilestoborder.push_back(Position(mouse_map_x - 1, mouse_map_y    , floor));
                tilestoborder.push_back(Position(mouse_map_x    , mouse_map_y + 1, floor));
                tilestoborder.push_back(Position(mouse_map_x + 1, mouse_map_y    , floor));

                if(event.ControlDown()) {
                    editor.undraw(tilestodraw, tilestoborder, event.AltDown());
                } else {
                    editor.draw(tilestodraw, tilestoborder, event.AltDown());
                }
            } else if(brush->isDoodad() || brush->isSpawn() || brush->isCreature()) {
                if(event.ControlDown()) {
                    if(brush->isDoodad()) {
                        PositionVector tilestodraw;
                        getTilesToDraw(mouse_map_x, mouse_map_y, floor, &tilestodraw, nullptr);
                        editor.undraw(tilestodraw, event.AltDown());
                    } else {
                        editor.undraw(Position(mouse_map_x, mouse_map_y, floor), event.ShiftDown() || event.AltDown());
                    }
                } else {
                    editor.draw(Position(mouse_map_x, mouse_map_y, floor), event.ShiftDown() || event.AltDown());
                }
            } else {
                if(brush->isGround() && event.AltDown()) {
                    replace_dragging = true;
                    Tile* draw_tile = editor.map.getTile(mouse_map_x, mouse_map_y, floor);
                    if(draw_tile) {
                        editor.replace_brush = draw_tile->getGroundBrush();
                    } else {
                        editor.replace_brush = nullptr;
                    }
                }

                if(brush->needBorders()) {
                    PositionVector tilestodraw;
                    PositionVector tilestoborder;

                    getTilesToDraw(mouse_map_x, mouse_map_y, floor, &tilestodraw, &tilestoborder);

                    if(event.ControlDown()) {
                        editor.undraw(tilestodraw, tilestoborder, event.AltDown());
                    } else {
                        editor.draw(tilestodraw, tilestoborder, event.AltDown());
                    }
                } else if(brush->oneSizeFitsAll()) {
                    if(brush->isHouseExit() || brush->isWaypoint()) {
                        editor.draw(Position(mouse_map_x, mouse_map_y, floor), event.AltDown());
                    } else {
                        PositionVector tilestodraw;
                        tilestodraw.push_back(Position(mouse_map_x,mouse_map_y, floor));
                        if(event.ControlDown()) {
                            editor.undraw(tilestodraw, event.AltDown());
                        } else {
                            editor.draw(tilestodraw, event.AltDown());
                        }
                    }
                } else {
                    PositionVector tilestodraw;

                    getTilesToDraw(mouse_map_x, mouse_map_y, floor, &tilestodraw, nullptr);

                    if(event.ControlDown()) {
                        editor.undraw(tilestodraw, event.AltDown());
                    } else {
                        editor.draw(tilestodraw, event.AltDown());
                    }
                }
            }
            // Change the doodad layout brush
            g_gui.FillDoodadPreviewBuffer();
        }
    }
    last_click_x = int(event.GetX()*zoom);
    last_click_y = int(event.GetY()*zoom);

    int start_x, start_y;
    static_cast<MapWindow*>(GetParent())->GetViewStart(&start_x, &start_y);
    last_click_abs_x = last_click_x + start_x;
    last_click_abs_y = last_click_y + start_y;

    last_click_map_x = mouse_map_x;
    last_click_map_y = mouse_map_y;
    last_click_map_z = floor;
    g_gui.RefreshView();
    g_gui.UpdateMinimap();
}


Athena Editor - as you can tell, my code is much more spread out and localized. That in my opinion makes it much more manageable and cleaner.

MapControl.cs - Mostly just delegates the events to the Tool class.
C#:
private void DoMouseEvent(MouseEventArgs e)
    {
      GenericMouseEventArgs genericArgs = new GenericMouseEventArgs() { EventArgs = e, Handled = AbstractTool.ToolReturnType.UnHandled };

      if (Common.Global.GlobalTool != null)
      {
        Common.Global.GlobalTool.EvaluateMouseEvent(genericArgs, this);
      }
 
      m_DefaultTool.EvaluateMouseEvent(genericArgs, this);

      Map.PushLoadingQueue();

      TileMouseIsOverPosition = PixelPointToMapPos(e.GetPosition(this));
    }

protected override void OnMouseDown(MouseButtonEventArgs e)
    {
      Keyboard.Focus(this);
      DoMouseEvent(e);
    }

    protected override void OnMouseUp(MouseButtonEventArgs e)
    {
      DoMouseEvent(e);
    }

MapMovementTool.cs
C#:
    public override ToolReturnType LeftMouseClick(MouseClickArgs clickArgs) {
      if (!(Common.IsControlDown() || Common.IsShiftDown()))
        clickArgs.Transform.Map.ClearSelectedItems();

      Tile tileClicked = clickArgs.Transform.GetTile(clickArgs.MouseClickLocation);
      if (tileClicked != null) {
        if (tileClicked.Items.Any())
          tileClicked.Items.LastOrDefault().IsSelected = true;
        clickArgs.Transform.Map.SelectTile(tileClicked);
        clickArgs.Transform.Update();
      }
      return ToolReturnType.Handled;
    }

WholeTileBrush.cs
C#:
public override ToolReturnType LeftMouseClick(MouseClickArgs clickArgs)
    {
      PlaceAtOneLocation(clickArgs.Transform.Map, clickArgs.TileClickedLocation);
 
      return ToolReturnType.Handled;
    }

RawBrush.cs (Inherits from WholeTileBrush.cs)
C#:
public override void PlaceAtOneLocation(Map map, Position position)
    {
      var tile = map.GetTile(position);
      tile.AddItem(Item.Create(ItemType));
    }

This is one of the reasons I didn't want to just extend RME. Trying to build a corner brush, or other various types of brushes into that class would be a bear, and would require rewriting it anyway.


Lets look at one other point of note. If you look at the brush window. In Remeres you basically have brush options based on whether your in Terrain, Doodad, Item, or Creature. The options are very generic, you can pick the brush size, but that is about it. If you look at Athenas, you'll notice that if I have a wall brush selected, I get a very customized window for a wall brush. If I have a tile selected, I get a very custom window based on that tile, things like the tile stack, the selected item's action ID, ect). If I have multiple tiles selected I get a different view that allows me to delete borders and items from that selection. These particular changes are not as much architectural as they are C++ vs C#. I'm sure you could do that with C++, but with wpf it is very clean and easy to do.


Obviously an editor is a lot more than a brushWindow and a mapcontrol, and I'm not claiming that every individual piece of code in my project is clean or sound. I'm not claiming that it is cleaner than remeres in all places, that code is very old and has had time to mature and refine individual code pieces. But I do think the architectural base is sound, there are holes in stuff that I still need to develop. I have spent probably a month of development time on this project, and to get something working I've made shortcuts in some areas. One example is the versioning right now is hard coded in a global location. I can only have 1 version loaded at a time. My goal is before I release to have that refactored locally so that you can run two version simultaneously but until I am there, that code is going to be unclean and needing refactoring.


Edit:

Lua Brush editor interface. Sidenote, compile checks for syntax errors, I realize lua is not a compiled language so that word doesn't make sense by the book definition.
LuaBrushEditor.png



My drawing abilities are terrible, but what tool bar do you guys prefer for adding and remove flags? Actually, I'l probably just pay someone in the spriting section to make me icons, some of those guys are amazing.
PVP / No Pvp / PZ / No Logout / Clear All Flags
Toolbar icons.png
 
Last edited:
Sorry I keep bumping this, I don't want to have a mile long chain edit to my last post.

I Integrated AvalonDock into the editor. I don't have it saving the state (so for now you to re arrange each time you launch), but you can re arrange the panels any you want now. You can also have as many brush windows as you please and any of them can be freestanding. In my opinion the docking is easier and a little better than remeres (you can have the map freestanding, and you can dock stuff on the bottom). Now all I did was implement an external library so I can't really take credit for the usability, but it seems to work very nicely.


Dockable Panels1.png

Dockable Panels2.png
 
Last edited:
Whatever the code is good looking right now does not matter. Ask those people that are complaining to make better proposals or just code the fixes/new code design themselves.
Remeres took ages to be the reliable map editor that everyone uses now. Even simone had a map editor that once a while someone asks for it because it had something different than remeres. Every improvement in a map editor that gives the mappers a better tool to give them more productivity is great and its should be the most important aspect/goal of a map editor.

I also like the fact its made in C#. C# is a modern popular language and building the tools using it is the best choice in my opinion, too bad it has no proper linux/mac support.
 
I feel obligated to provide a more detailed response to people suggesting my code is in disarray.
Literally no one in this thread suggested your code is in disarray. @Ezzz only said that "the code needs some clean up", and I said that "judging by [your] previous thread" that's probably true because multiple people posted that you should start smaller for your first program and you didn't once correct anyone and say that this wasn't your first program. Everyone's code could use some clean up to some degree. Where I work, we do code review for that exact reason.
But just generalizing the entire project as shit, is pretty demeaning.
How do you get this from "the code needs some clean up"? You literally put words in his mouth. I was interested in this project; I offered to do code review, and I even went so far as to try to compile it and give you feedback on the issues I encountered. But after one "negative" comment you go off the deep end. That made me lose respect for you, and now I don't have any desire to contribute to this project in any way. You have to take criticism in stride. Like this post I'm making, you have to take it in stride.

Regardless of what I just said, I do wish you the best with this project. Like I said before, I'm a fan of C#, so I like to see projects like this utilize the language. I'd love to see you reach your goals with this project, and for it to become the map editor that people choose to use.
 
Literally no one in this thread suggested your code is in disarray. @Ezzz only said that "the code needs some clean up", and I said that "judging by [your] previous thread" that's probably true because multiple people posted that you should start smaller for your first program and you didn't once correct anyone and say that this wasn't your first program. Everyone's code could use some clean up to some degree. Where I work, we do code review for that exact reason.

How do you get this from "the code needs some clean up"? You literally put words in his mouth. I was interested in this project; I offered to do code review, and I even went so far as to try to compile it and give you feedback on the issues I encountered. But after one "negative" comment you go off the deep end. That made me lose respect for you, and now I don't have any desire to contribute to this project in any way. You have to take criticism in stride. Like this post I'm making, you have to take it in stride.

Regardless of what I just said, I do wish you the best with this project. Like I said before, I'm a fan of C#, so I like to see projects like this utilize the language. I'd love to see you reach your goals with this project, and for it to become the map editor that people choose to use.
Literally no one? Did you read ezzs post? But anyhow you clearly didn't read too much of the previous thread then. I'm not here for anyone's respect. Think what you want of me. Ezz basicaly posted 'oh boy this code is a f*cking disaster' so for the average observer yes I think I need to defend that., I dont want people to have a false impression. But as I've said to him, if all you have is criticism, please don't post here. If you consider everything as shit, that adds absolutely nothing to the conversation and is just spam.


I have deleted my repository. This community is too toxic for this project to be open source
 
Last edited:
Literally no one?
Yes, literally no one.
Did you read ezzs post?...Ezz basicaly posted 'oh boy this code is a f*cking disaster'...
Actually, he never said that. Let me quote it for you, so you can read it again.
The code needs some clean up for sure :eek:
I've read his post over a dozen times and I still can't find where he said "oh boy this code is a f*cking disaster". But if you could point out where he said that, that would be very helpful.

I said, "multiple people posted that you should start smaller for your first program and you didn't once correct anyone and say that this wasn't your first program" and you responded with
But anyhow you clearly didn't read too much of the previous thread then.
I did read it. The whole thing. Maybe you didn't? If that's the case, I'll quote some of it so that you understand. I'd first like to point out that the thread is called "My first program, need help" if that helps in your understanding.

The very first post in that thread:
I'd suggest to start with something smaller.
and you responded:
I'm optimistic! I'l post updates as soon as I figure out how to get the map rendering :)

Do you have any suggestions?
I'll post the next quotes starting with someone saying you should start with a smaller program for your first one, followed by your response.
In all seriousness though, He should start with a smaller program, and work his way up.
Don't doubt the project! Just give me some suggestions on how to improve on rme
I would really suggest you to start with a simple console program.
You didn't respond to this one.

There's more where people say you're missing the basics, and you respond asking them to tell you what basics you're missing. That's pretty much the same thing. But the main point I'm trying to make is that I said you never once corrected anyone about this being your first program, and you responded that I "clearly didn't read too much of the previous thread" even though my statement is true. I'm just confused as to how you're saying that I didn't read it, though it seems to me that you're the one who didn't read it?

But as I've said to him, if all you have is criticism, please don't post here. If you consider everything as shit, that adds absolutely nothing to the conversation and is just spam.
I never once criticized your code. I said, "To be fair, judging by his previous thread, this was his first program that he started on a year ago. I would expect his code to need some clean up.", but there's no criticism in that statement. It's just a statement. If you can point out where I criticized your code, I will publicly take back everything I've said. "If you consider everything as shit" I'm still trying to figure out what you mean by this. I never once "considered everything as shit". But, just like I've stated multiple times now, if you can point out where I did that I will take everything back. The only thing I did was call you out for flipping out over one small, "negative" comment.

I have deleted my repository. This community is too toxic for this project to be open source
I will agree with you, this community is toxic, but flipping out over one "negative" (I keep putting 'negative' in quotations because the comment wasn't negative, it was a factual statement) comment and someone calling you out for it does not make this community toxic. "I have deleted my repository." This quote is my favorite, and I'll tell you why. It's my favorite because, in just five words, you've proven everything I've said.

I have backed up everything I've said with facts and quotes, all you've done is negatively target users who didn't deserve and made up false quotes. Unless you can respond with facts and/or real quotes to defend yourself, this discussion is over.
 
I mentioned I was trolling in the third post. And to get a complete rendering working by 'finding the render function' and being 10 years old. It was very obvious I was trolling. I never said that you've commented on my code. I said if all you have is criticism you can leave. That was directed towards your attiude in general. Your a toxic person, and its not constructive. Therefore, please don't ever post in this thread again.
 
I mentioned I was trolling in the third post. And to get a complete rendering working by 'finding the render function' and being 10 years old. It was very obvious I was trolling. I never said that you've commented on my code. I said if all you have is criticism you can leave. That was directed towards your attiude in general. Your a toxic person, and its not constructive. Therefore, please don't ever post in this thread again.
Dunno why I was commented into the discussion. :p

But yeah, awhile ago when you first started posting about 'your first program' my initial reaction was definitely of shock.
I posted my reply, so you wouldn't be discouraged from learning how to code.
Once we realized a few posts down that his age and skill level were much above the initial trolling, I believe I started giving suggestions and input, from what I could see of the project.

I for one, hope you continue the project, whether or not it remains open source or not.
I'd love to continue being apart of the journey.

Cheers,

Xikini
 
Dunno why I was commented into the discussion. :p

But yeah, awhile ago when you first started posting about 'your first program' my initial reaction was definitely of shock.
I posted my reply, so you wouldn't be discouraged from learning how to code.
Once we realized a few posts down that his age and skill level were much above the initial trolling, I believe I started giving suggestions and input, from what I could see of the project.

I for one, hope you continue the project, whether or not it remains open source or not.
I'd love to continue being apart of the journey.

Cheers,

Xikini
Thanks and I appriciated and still appriciate the support. It's good to still see you around :) I apologize the development faded for a couple months. As for my original thread, I thought it was pretty obvious i was trolling after the second or so post, but apparently not to some people. Just wanted to have some fun for a bit lol. I posted it initially under programming so that it wouldnt be as visible as a more global place. Simply because i didnt want to give a lot people false hope that it would get finished. A map editor is a large project to undertake and many fail. I will say that I am determined to finish this project simply from the time I've invested into it. It would be a shame to see that go to waste. I will re release the source at a later date closer to release. But right now this whole thread has delved into a flame war, which I'm hoping will calm down a bit., and I would welcome the mods deleting all flaming or off topic posts, mine included. But being judged on in complete or misunderstood sections of code and constantly having to defend myself against people trying to put me down isn't my definition of fun nor constructive. So for the time being the source is closed. I will continue to update this thread with binaries and updates. There are some toxic members, but there are a lot of good and supportive people aswell. I should just ignore the very few negative people, but I have a hard time doing that. It's easier just to take my ball and go home figuratively speaking
 
@Jo3Bingham I had to report his post because he used plenty of swear words, I'm guessing a mod edited it to look friendlier, but it was pretty disgusting to read. I totally lost respect for him when I read the first "f* you" words in it, not worth my time.

He should learn to take criticism, what a dramatic useless reaction, I'm with no words. :confused:

@Thread Good luck with your hobby project
 
Back
Top