Posted by & filed under Project.

This project was spurred by the fact that bPermissions’s promotion system limitations. While it focus’s on tracks, the actual permission node for each track uses one node per group. My desired setup was that normal users could promote Guests. Giving users the promote.User permission node would then allow users the ability to both promote to guests to User and to demote them from it. Not ideal. While I first debated forking and submitting a patch (which I half did), I also wanted the promotion commands to be more configurable. Currently they were /promote [trackname]. Which would force a mod use the command more than once to go all the way from Guest -> Mod.

VaultPromoter uses Vault as a backend so it should work with all permission plugin it can use. The commands are configurable, as well as the text sent to the players. The text also takes context into account. Commands are in the format:

/<command> target1 target2

To Do

  • I still need to make a settings file and it’s parser as all planned settings are all hardcoded in.
  • If I plan on putting this on Bukkit Dev, I’ll also need to make an installer that will create a default configuration file(s).
  • I will need to get my old color code filters and word wrapping put into this plugin.

Posted by & filed under Project Summaries.

jsPaint

I wanted to create my own doodle app that would upload to imgur.com. I decided to tackle javascript and its various libraries (JQuery, fabric.js). It also made me familiar with HTML’s new canvas element, and the “HTML5″ brand’s new techniques.

MegaUpload Batch Downloader (Python)

I started watching One Piece. Unfortunately, >400 episodes to download is fairly annoying to do manually. So I fired up python and made a script to download from megaupload in a single-threaded environment using Mechanize and BeautifulSoup.

Bukkit Plugin – CellWar (Currently Integrated Into Towny)

I started getting re-involved with Towny’s development, and got some inspiration from users about how to do warring Nations. I also took a gander at some of the mechanics of a similar plugin that did PvP stuff right, Factions. I coded up some threaded tasks that created a huge beacon in the sky overtop the area under attack. The game mechanic was to attack and hold the area. Towny’s war event is the same thing, but there’s nothing physical. So I created a focus for the defenders. Attacking would have the attacker place a flag, which the defenders would need to break / take down.

pyTactics (PyGame)

I wanted to try making my own Tactics engine, inspired from Final Fantasy Tactics and the 40 Hour challenge, I only knew Python and Java at the time, and wanted to learn more with Python. So I took a second shot at Pygame (I’d tried to port an old Turing project before). I managed to get the isometric down right, as with the height levels, but my code re-rendered the whole map every tick which was terrible so I scrapped the project.

Bukkit Plugin – Questioner

I wanted a way to integrate accept/deny ability to Towny’s invitation’s to join towns and other user confirmations. At the time, there was no customizable API available for the task, so I made my own.

Bukkit Plugin – Towny

I converted Towny to Bukkit when it became apparent hMod was dieing. The initial release didn’t include the wall generation code, however I did add iConomy support as well as a taxation system. I then coded up a (rather sloppy) implementation of having residents own plots inside towns.The rewrite had me focus on getters/setters, exception handling (as well as custom exceptions), as well as focus on the inevitable problem the hMod had. hMod didn’t plan for when Minecraft would eventually allow users to move between more than one world on a single server, but the Bukkit dev’s had foresight.

hMod Plugin – Arena

A server owner was asking for a plugin to kick off his server and make it more unique. Basically a new player would be forced to tackle a waves of enemies when he first joined before being able to select his faction. This was my first tackle on a paid project, and gave me a tons of experience for what to do next time.

Posted by & filed under Uncategorized.

One of the most annoying things about using Chrome is the StumbleUpon extension. It’s a terrible port for those used to the responsiveness of Firefox’s addons UI. Clicking on the Icon will inject an iframe, which takes a bit to load. That same iframe is injected for every page thereafter until you click the SU icon again. The annoying part is that it’s slow. It needs to load a bunch of javascript when you want it, and when you don’t want it. The latter being when it’s loading on every next page till you turn it off.

So what can be done about it?

If I were to write a full extension, I’d scrap the whole ‘toolbar’ idea. Chrome supports very minimal UI options, but it does have some! First off, it has the notification buttons. If Chrome doesn’t limit you to only 1 button per extension, why not make the major stumble button and a separate button to have a menu for Share, Account, etc.

Since it looks like you can only have one browser_action (button) per extension, then try moving the “stumble” browser_action into the top of the stumble menu browser_action. Then launch a stumble button extension for power users that don’t like having to click+wait+click for random stumbling.

Unfortunately, I’m still rather hackish in javascript. I know my way round the syntax, but writing an extire Chrome extension is beyond me for now. So instead, I focused on what I actually use the toolbar for.

I only use the toolbar for the share button and drop down. I get email alerts whenever a friend shares with me, which combined with a GMail Notifier gives me a live view of my friends shares. I rarely (/never) use the Stumble button anymore since I’ve started browsing Reddit.

The StumbleUpon Share Bookmarklet

So ultimately, I wrote a bookmarklet to inject just the share box.

Source:

javascript:
(function(global){

global.SUT = {
    sharePanelUrl: function(url) {
        return 'http://www.stumbleupon.com/share/?url='+url+'&src=website&mode=toStumbler';
    },
    closeSharePanel: function() {
        SUT.deleteNode(document.getElementById('SUshareWrapper'));
    },
    deleteNode: function(n) {
        n.parentNode.removeChild(n);
    }
};

var d = document,
    b = d.getElementsByTagName('body')[0],
    w = d.createElement('div'), // Wrapper
    wS = w.style; // Wrapper.style

wS.top = '0';
wS.left = '0';
wS.width = '100%';
wS.zIndex = '999';
wS.position = 'fixed';
wS.backgroundColor = '#fff';
wS.borderBottom = '1px solid black';
wS.textAlign = 'center';
w.id = 'SUshareWrapper';
w.innerHTML = '<iframe src="'+encodeURI(SUT.sharePanelUrl(d.URL.split("#")[0]))+'" style="width: 100%; height: 300px; border-top-style: none; border-right-style: none; border-bottom-style: none; border-left-style: none; border-width: initial; border-color: initial; overflow-x: hidden; overflow-y: hidden; "></iframe><input type="button" width="100%" height="15px" onclick="javascript:SUT.closeSharePanel()" value="Close"></input>';
b.appendChild(w);

})(typeof exports != 'undefined' ? exports : this);

Creating the Bookmarklet

Creating the bookmarklet was fun. It is by all means not perfect probably, as I didn’t sweep through it for minimalism. Nor is setting a global object the best approach. I also found out that browsers (or just Chrome?) don’t let you get objects created in a top frame from an iframe unless the protocol and domain match. Thus I wasn’t able to hook the closing call after a successful share.

I also found out that dynamically created fixed objects will have it’s x coordinate relative to the #anchor tag if found. I relearned to always encode my URLs before submitting them as parameters.

The best tool for bookmarklets however, is a javascript compressor. This let’s you write in a decent working environment (readable variable names), before ‘compiling’ it for the bookmarklet. Last but not least, always use ‘ and ‘ when dealing with bookmarklets, at least if you’re planing to use the bookmarklet as a URL on a webpage.

Posted by & filed under jsPaint, Project.

I love DeviantArt’s Muro sketchpad. It’s freaking amazing. I just don’t want every doodle to end up in my DA gallery. So, I needed a different image host. Just so happens Imgur has an API, with examples (well rough ones). I also just so happen to be wanting a project to learn JQuery. Thus, this new project was born.

Right now, it has the ability to anonymously upload the canvas to Imgur. This took a fair bit of tinkering as there’s no set standard yet for sending canvases as FormData. I ended up combining a few scripts together to get a getBlob() function working (blob has got to be the most ambiguous name ever for this functionality).

I read a few tutorials on creating a basic painting app so that I could test out a simple creation. I found this article to be fairly good to draw actual lines. I’ll be looking into a better method later, as right now this code is running on only two classes which are barely used.

I added a nice brush size cursor overlay, and let the mousewheel control the brush size like in Photoshop with the appropriate JQuery plugin.

My next goal is getting the drawing part to have layers, and an undo function. Both require a well thought out bunch of classes, which is why I haven’t bothered tackling them yet. From there I can make keyboard shortcuts.

You can try the latest demo at: http://xshade.ca/draw/index.html or check out the code on GitHub.

Posted by & filed under Uncategorized.

Getting Drupal to be sleek is tedious. There’s a fair amount of imperfections in the UI. Maybe I’ve not used enough plugins (or the wrong ones), but I’ll stick with the number one newbie CMS, WordPress.

Posted by & filed under pyTactics, Uncategorized.

Spent more than 8 hours. Oh well. You tend to have major code rushes at the start of a new project.

  1. Planning
  2. Tiles
  3. Blarg PyGame. Blarg Pngs. Blarg transparency.
  4. Not pixel perfect.
  5. Reusing old code for the engine.
  6. Render order.
  7. Nicer looking tiles. Pause screen.
  8. Major Rewrite of grid layering. Instead of a different surface for each tile/layer, blit each cell to a single surface.
  9. Player Spritesheet and render player.
  10. Player can move with keyboard input. Fancy selection hover effect.
  11. Simple pathfinding that incoperates height.
  12. Fixing up movement from pathfinding. Move the camera as player moves.
  13. Working on teleporting

Posted by & filed under Project, pyTactics.

Over the last month or so, I’ve been learning and tinkering around with Python. From there, I’ve also played with Pygame for general drawing of sprites and input. I think I’ve reached a level of understanding that would allow me to create a decent project. My inspiration for this is Jay Barnson’s article on Building a Game From Scratch With No Budget. He allocated only a week, or a full 40 hours for the whole development.

I’ll be doing something similar. The 40 hour time limit will be used to create a tech demo of a python implementation of a Final Fantasy Tactics esque game. Using Python + Pygame with either free to use resources or my horible programmer art. As I have no skills whatsoever with music, I’ll be relying on CC Liscence music and for sound effects.

The goal is to have a playable battle engine by weeks end (or 40 Hours).

  • 2D Isometric map with heighmap.
  • Unit turns based on stats (units can be stunned thus delaying them).
  • Technique system.
  • Area effect techniques.

Focus on gameplay not sprites, and priotize the actual chunk of gametime (battles vs story). The following are secondary for completion in the tech demo.

  • Attack animations. Use a simple damage count.
  • Item sprites.
  • Storyboard scenes.

Skimping on Music and sound effects can turn even the most fun games into boring facebook games. So don’t forget it!

40 Hours Schedule

No more than 8 hours can be used in a particular day. Forcing a fresh look at the problem.

Planning (Hour 1)

The first hour will be done away from the IDE, either designing the layout with pen and paper or problem solving tasks. Any extra time at this point can be used researching for game art/resources.

Read more »

Posted by & filed under Uncategorized.

Today I fumbled around with the Drupal content management system. The theme I edited isn’t perfect (the header still sucks) but it’ll do for now. Tomorrow I’ll tackle finishing up towny’s admin panel, and getting as much town related content to be accessible by admins. I will also be migrating the documentation content from the google site over to here.

Posted by & filed under Project Summaries.

hMod Plugin – Towny

Then hMod really started picking up heat and introduced plugins. I decided to use my Java skills I learned. I wanted a way for users to manage their own towns, and the more people in the town, the more perks. As the idea expanded, I eventually started planning that towns would be part of a hierarchy with nations at the top. I fist wrote mapper, which would show where the town was founded, but I kept getting user feedback that Towny should protect areas.

My initial code was terrible. I tried writing my own XML parser/writer for persistence.

When I finally decided on just a plain flatfile, and with the heirachy code done (but oh so buggy), I was ready to tackle integrating with another cuboid plugin for area protection. I started talking with some on IRC, and a dude was dishearted that I was just going to force players to use cuboid to select an area, and gave me the idea of having the town expand from a central point. Like a protective sphere.

I started looking into cuboid and how it did block protection. This was around the time when dev’s started talking about how checking if a block was in a list of cuboids was a terrible idea. Eventually cuboid got on the path of using K-D Tree. That threw my sphere idea out, but I started on thinking about a chunk based system.

hMod Plugin – ChatChannels

A server I was on wanted specific channels for each faction on the server. I was partway into coding Towny, so this was a good relief and learning stepping stone. I took some idea’s from how IRC operated, but the code didn’t use much OOP.

hMod Plugin – Mapper

After I first got the spark to start writing Towny, I wanted a visual representation of where the towns were. This lead me to expand on the Cartographer idea (a top down render of a minecraft world). I made it so ingame coordinates could be passed to a flatfile (type:string:x,z). I then worked on a stand alone program that would take a cartographer rendering, and draw the notes onto it. For testing, one of the types I used was all the player’s locations at the time. I like to think is the inspiration behind the current map viewers.