Category Archives: C++

Implemented Hardcore Mode in Arcemu

I read an article on wccftech about Blizzard planning on implementing Hardcore Mode.

Basically this means that when a player dies the character is deleted.

I thought to myself, sounds easy to implement, so I’ve done it!

It is available now as an optional feature.

Yet another Arcemu Python Engine video

This video shows a scripted NPC (Guard Roberts) during the human quest Garments of the Light.

You get quest credit for the following:

  • Heal Guard Roberts with Lesser Heal rank 2
  • Buff Guard Roberts with Power Word: Fortitude rank 1

When healing he stands up, turns towards you, bows, and thanks you.

After buffing him, he cheers, thanks you again and goes on his way saying his farewells. Then despawns and respawns.

Up until now this wasn’t working in Arcemu, making the quest unfinishable.

The script can be found here: https://github.com/arcemu/arcemu/blob/master/src/scripts/pythonscripts/prod/guard_roberts.py

…and here’s a video:

Arcemu Python Engine showoff video #1

I’ve recorded and uploaded a video to show off some of what can be done with Python NPC scripts in Arcemu.

I think it’s quite fun.

The script itself can be found here:
https://github.com/arcemu/arcemu/blob/master/src/scripts/pythonscripts/dev/mohawk.py

Arcemu Python Engine (APE)

I’ve just pushed a new Arcemu scripting engine’s code (195 commits) to Arcemu’s main code repository.

Lately I’ve had to deal a lot with Python at work, and I thought it would be a nice experiment to add Python scripting support to Arcemu, so during last year’s Christmas I started implementing it.
To make this work first I had to get and compile Python with CMake and both Visual Studio 2010 as Arcemu still supports that.
I made my version of Python 3.4.10 separately available on my Github page as well, so if anyone would like to play around with that they can find it here:

https://github.com/dfighter1985/python34

After that I had to learn to both extend and embed Python. You can find some details about those in the official documentation of Python:
https://docs.python.org/3/extending/extending.html
https://docs.python.org/3/extending/embedding.html

While this new Arcemu scripting engine is still experimental and not at all complete it can still be fun for others too. That’s why I decided to push it today.

The “release” if you will includes some sample Python scripts that I used for testing functionality that I implemented. You can find these here:
https://github.com/arcemu/arcemu/tree/master/src/scripts/pythonscripts

If you’d like to try make sure to set BUILD_PYTHONENGINE and INSTALL_EXAMPLE_PYTHON_SCRIPTS to True in CMake when building the code.
I will continue to extend it and will probably write about it more at a later time.

Until then have fun!

 

Arcemu Dungeon Finder

Arcemu has been a pet project of mine for a long time.

Lately whenever I could find a little time, I’ve been working on implementing a feature that has been missing from Arcemu for a very long time: Dungeon Finder

While it’s far from done, today I enabled the periodic automatic LFG queue update, which means if the LFG is enabled in the config, you no longer need to use a GM command to update the queue and assemble groups, it will be done automagically.

Here’s a list of use cases that I’ve mostly implemented:

  • Joining / leaving queues for both specific and random dungeons
  • Assembling groups for those dungeons
  • Group ready check when a group is ready
  • Requeing the group if someone fails the ready check
  • Teleporting in and out of dungeons

There’s still tons of work (new features, more checks, constant refactoring) to be done, but it’s good for a hobby.

Either way, here’s a little video about queuing, ready checking, and teleporting:

 

 

 

New GUI for kdev-cppcheck

Hi there!

As you all probably know CppCheck is static code analyzer tool for C and C++. KDevelop has a plugin that provides a front-end for it, and the plugin is called kdev-cppcheck.

The good news is I’ve updated it’s GUI and now it uses the KDevelop Problem Checker Framework.

In the past it used to have it’s own toolview, where it showed issues in different formats (flat issue list, grouped by files, grouped by issue severity), based on the settings set in a KCM module.

Here’s a screenshot showing and example of this

20150722_000003008

What I’ve done is break up that KCM module, and create a per project settings window, and a general global settings window. The global settings window allows you to set the location of the cppcheck tool

20150722_000003009

The per project settings window allows one to set the rest: parameters, and what should be checked

20150722_000003010

Also the results area now shown in the problems toolview, just like problems found by the background parser, in it’s own tab.

20150722_000003011

Here’s a video showing the workflow

New GUI for kdev-krazy2

Hi there!

First of all let me introduce some concepts for readers who are unfamilair with them.

What is krayz2?

Krazy2 is a set of code tests (basically static code analysis) for KDE developers.

What is kdev-krazy2?

kdev-krazy is a plugin for KDevelop, that provides a frontend for Krazy2, so it can be run directly from KDevelop. The resulting issues also show up in KDevelop.

What’s changed?

I’ve given some love to this plugin lately: First I ported it to KF5 so it can run in the latest KDevelop. Now I’ve changed it’s GUI so it now uses the new KDevelop Problem Checker Framework.

Up until now the plugin had it’s own toolview. That’s where settings could be changed, analysis started, and that’s where the issues showed up. Let’s see some screenshots!

The first one shows the main KDevelop window, with the plugin loaded, showing the krazy2 toolview docked in the bottom (fairly large picture, feel free to click).

20150720_000002991

Clicking either the “Select paths” or “Select checkers” buttons shows settings dialogs, not surprisingly you can select paths and chekers in them. The next 2 screenshots shows those.

20150720_000002992

20150720_000002993

Finally the result of the analysis is shown in the toolview

20150720_000002994

All this was in the past. Now the settings can be changed in the per project settings window

20150720_000002995

20150720_000002996

The analysis can be started from the Run menu.

20150720_000002997

The results show up in the problems toolview, the same way that problems detected by the background parser, in a separate tab

20150720_000002998

Here’s a video showing how it all works

 

KDevelop Checker Framework – pushed

Hi there!

I’m pleased to announce that the KDevelop Checker Framework has been pushed to the KDevPlatform repository. Here are some details about it:

GUI changes

  • Moved ProblemModel to shell
  • Reworked the Problems toolview. Now it works like this:
    • ProblemModels are added to ProblemModelSet.
    • ProblemReporterFactory makes instances of ProblemsView.
    • ProblemsView takes the models from ProblemModelSet (also subscribes for updates about them, so if one is added or removed it can add/remove their views) and it provides a tabbed widget where the views for them can be added. It creates instances of ProblemTreeView which show the problems in ProblemModel, and adds them to the tabs. Also the tabs shows the number of problems in the ProblemModels.
    • The toolview will only add actions that are supported by the model (for example: filtering, grouping, reparsing, showing imports. Obviously reparsing doesn’t make sense for runtime problem checkers)

See the video:

  • First it shows that the “old” problem reporter still works as intended (which also uses the new code now)
  • Then from 1:07 onward it shows an example problem model/view working with randomly generated test data.
  • It shows the features of the new model(s), that is filtering by files/project and issue severity.
  • It also shows the grouping support (grouping by severity, and path.

ProblemModel details

  • Broke up ProblemModel into 2 parts
    • Base ProblemModel that provides the QAbstractItemModel interface for views and can use various ProblemStores to store problems. By default it uses FilteredProblemStore.
    • ProblemReporterModel is basically the old ProblemModel that grabs problems from DUChain, it’s a subclass of ProblemModel.
  • ProblemStore simply stores problems as a list (well technically it stores them in a tree, but it only has 1 level, so it’s a list). There’s no filtering, no grouping. It’s perfect for ProblemReporterModel since it does filtering itself when grabbing the problems from DUChain.
  • FilteredProblemStore DOES filtering, and grouping itself. It stores problems in a tree (ProblemStoreNode subclasses). The tree structure depends on the grouping method, which is implemented with GroupingStrategy subclasses.
  • Moved WatchedDocumentSet and it’s subclasses from ProblemModel to ProblemStore, as it is really a detail that the model itself doesn’t need, however ProblemStore which stores the problems needs it actually.
  • Created a new Problem class, DetectedProblem and moved both this and the “old” Problem class in under the IProblem interface. The intent here was to create a class with a clear interface for problems, which ProblemStore can simply store. I wanted to eventually clear the problems out of DUChain and replace the “old” Problem class with it. However I realized that it’s not practical because of the “show imports” feature which shows the problems from imported contexts. Unfortunately DUChain is the class that knows those, and it’s way too much work to get it out from it. Not to mention it doesn’t even make sense, since it’s really something that logically belongs there.

Using this new system is fairly straightforward:

All one has to do is instantiate a model, add it to the model set:

KDevelop::ILanguageController *lc =  KDevelop::ICore::self()->languageController();
KDevelop::ProblemModelSet *pms = lc->problemModelSet();
m_model = new KDevelop::ProblemModel(this);
pms->addModel(“Test”, m_model);

Then later inject problems into it:

KDevelop::DetectedProblem *p = new KDevelop::DetectedProblem();
p->setDescription(“Some message”);
p->setFinalLocation(KDevelop::IndexedString(“/just/a/bogus/path/yada.cpp”));
p->setSource(KDevelop::IProblem::Plugin);
p->setSeverity(KDevelop::IProblem::Error);
model->addProblem(KDevelop::IProblem::Ptr(p));

Here’s a class diagram about the relevant classes:

20150714_000002956

kdev-krazy2 ported to KF5

Good news everyone!

The KDevelop frontend for Krazy tools has been ported to KF5, so it now works with the KF5 version of KDevelop.

20150714_000002954

KDevelop – Checker framework

Hi there!

So I got a slot for GSOC2015 to implement a “Checker framework” for KDevelop, therefore I have been and I will be working on it during the summer.

The project has 3 phases

  1. Create a framework that problem checker plugin developers can push issues into, so that they don’t have to create their own infrastructure for it (like models, views, toolviews for the views, etc)
  2. Update some of the already existing plugins to use this framework (kdev-krazy, kdev-cppcheck, kdev-valgrind)
  3. Implement 2 new checker tools using the framework (clang-check, pylint).

A little bottom-line explanation:

This framework will basically mean a common (obviously subclassable) model that can be used for storing problems, some infrastructure for holding such models, and views. The model will be a refactored, cleaned up version of the current ProblemModel that is used by the problem reporter plugin. The toolview of that plugin will also be cleaned up and refactored, and provide a better view for the model(s).

Up to now I’ve been already working on creating this framework.

  • Now it is a tabbed view, and the tabs show the number of problems in the currently shown view
  • I’ve also created a class that holds problem models, and those models automatically get a view in a tab in the problem toolview

I am now in the process of refactoring the ProblemModel.

Here are two screenshots comparing the “old” toolview with the “new” one:

20150327_000002297 20150531_000002772