This is not a release.
What the hell is ISNOGI?
ISNOGI is the (as of this posting) the most advanced Mabinogi private server in development. Its current incarnation was started in August 2011. I've worked on it off and on as a side project since then.
What is this thread for, then?
It's been boring on this forum for a while, so I'd like to start up some constructive discussion. Plus, I'm sure many people really are looking forward to a private server in the future, as more Nexon branches close down and with the addition of all the updates destructive to the gameplay.
Gimme some more info on the project!
I'm writing it in pure C#. Some people would criticize this, but because of this, the server boasts full compatibility with both Windows and Linux. It uses a MySQL database for saving characters, NPC spawn locations, and everything else.
Currently, the project is about 7,500 lines in total.
Is it JUST you?
Yes. I haven't gotten anyone else to collaborate mostly because I'm a dick when I think things should be done a certain way. I think working with someone would be more of a burden than a blessing.
What works?
Movement, portals, etc. (Basically, you can get around)
NPC Conversations, shops, and (very dynamic) scripting
Items, item scripting
Chat
Lots of fun GM commands
Very, very basic combat
What doesn't (or is incomplete)
Quests and skills (the scripting systems are in place for both of these, however)
Leveling/Exp (will be easy once combat is complete)
Other less important stuff
What are your plans for release?
For obvious reasons, I do not have any plans for release as of now. This will most likely change eventually, or if Nexon stops hosting Mabinogi on
all regional servers. For now, I am sticking with small play tests with just people in a few skype groups I'm in that don't annoy the hell out of me.
Some scripting examples?
Here's an example of an NPC script (still very incomplete, but this gives you a rough idea)
Code:
using System;
using MabiScript;
using MabiWorld;
public class TurtleScript : NPCScript
{
private MabiVertex spawnLocation;
private int wanderDist = 600;
public override void OnInitialize()
{
SetName("Turtle the Test AI");
SetRace(10002);
SetFace(16, 32, 176, 2);
SetBody((float)0.1, (float)0.7, (float)0.7, (float)0.7);
SetDirection(121);
SetItem(GetItem(6900, 16, 4535369, 4294967295), 3, 0, 0); // Head
SetItem(GetItem(4007, 268435490, 0, 1122876), 4, 0, 0); // Hair
SetItem(GetItem(15168, 0x422878, 0x422878, 0x422878), 5, 0, 0);
SetItem(GetItem(17012, 0x422878, 0, 0), 7, 0, 0);
spawnLocation = NPC.GetPosition();
setupShop();
registerScriptEventHandlers();
}
private void setupShop()
{
AddToShop("[0]TestTab", GetItem(1000, 0, 0, 0));
}
private void registerScriptEventHandlers()
{
RegisterScriptEventHandler("turtle_testevent", ScriptTestEventHandler);
}
public void ScriptTestEventHandler(MabiWorldEntity sender, object args)
{
Say("Got test event!");
}
public override void OnChatBegin(MabiCreature sourcePlayer, MabiCreature targetNPC)
{
SendChatMessage(sourcePlayer, "Yo, I am Turtle the Test AI.<button title ='Shop' keyword='@shop'/><button title ='Wander' keyword='@wander'/><button title ='FIGHT ME!' keyword='@fight'/><button title ='Call test event' keyword='@testevent'/>");
GetChatResponse(sourcePlayer, "@shop", "@wander", "@fight", "@testevent");
}
public override void OnChatResponse(MabiCreature sourcePlayer, MabiCreature targetNPC, string response)
{
switch(response)
{
case "@shop":
SendChatMessage(sourcePlayer, "This is my shop!");
DisplayShop(sourcePlayer);
break;
case "@wander":
SendChatMessage(sourcePlayer, "Idle wandering!");
IdleWander();
break;
case "@fight":
SendChatMessage(sourcePlayer, "You asked for it!");
Fight(sourcePlayer);
break;
case "@testevent":
SendChatMessage(sourcePlayer, "Calling test event!");
CallScriptEvent(NPC, "turtle_testevent", null);
break;
}
}
public override void OnChatEnd(MabiCreature sourcePlayer, MabiCreature targetNPC)
{
Say("Chat ended!");
}
public void IdleWander()
{
AIStackClear();
Random random = new Random();
for (int i = 0; i < 20; i++)
{
AIStackAddMove((UInt32)(spawnLocation.X + (random.Next(-1 * wanderDist, wanderDist))), (UInt32)(spawnLocation.Y + (random.Next(-1 * wanderDist, wanderDist))), true);
AIStackAddWait((UInt32)random.Next(4000, 10000));
}
AIStackAddRepeat();
}
public void Fight(MabiCreature target)
{
AIStackClear();
AIStackAddNormalAttack(target);
AIStackAddRepeat();
}
}
Pics or it didn't happen!
In some (one?) of these pics, I am naked/headless. Ignore that, it was due to a bug that's long been fixed.
[Only registered and activated users can see links. Click Here To Register...]
[Only registered and activated users can see links. Click Here To Register...]
(I'll add more pics later, I am not currently at home. There's more pics in my signature)
I HAVE AN IDEA FOR THE SERVER!!!
Join the IRC and discuss it. The IRC channel is mentioned below.
Other stuff
If you're working on a private server, I'd love to discuss projects. You can PM me. For everyone else, I made a #ISNOGI channel on the Rizon IRC network. You can use a webclient
[Only registered and activated users can see links. Click Here To Register...] to connect. We mostly discuss ideas for the server there. Feel free to ask either on this thread or on the IRC channel any questions you have.