Moonlight
Moonlight is made for easily create .NET application for NosTale using an easy to use API.
Install / Use
/learn @Roxeez/MoonlightREADME
Moonlight
Moonlight aims to make NosTale .NET Application developer life easier by giving them access to a complete & easy to use API allowing them to interact with (almost) everything in the game
Moonlight can be used with local client (injected .dll) or remote client (clientless)
<br><br>
Getting Started
- Create a C# .dll project targeting .NET Framework 4.7+
- Add Moonlight as submodule
- Install DllExport to your project and create your export function (cf. DllExport wiki)
- Build your project
- Create database.db using Moonlight.Toolkit CLI
- Copy previously generated database.db to a subfolder named Moonlight in your NosTale folder
- Copy your generated .dll & MoonlightCore to your NosTale folder
- Inject your .dll using an injector supporting custom export function.
<sub><sup>Moonlight is a packet based lib, so if you want everything to work correctly using local client, it should be injected before character selection.</sub></sup>
Example
Example application can be found here : https://github.com/Roxeez/Moonlight.Example
private async Task BotLoop()
{
while (IsRunning)
{
IEnumerable<Monster> monsters;
Skill zoneSkill;
do
{
zoneSkill = Configuration.UsedSkills.FirstOrDefault(x => !x.IsOnCooldown);
monsters = Client.Character.Map.Monsters
.Where(x => x.Vnum == MonsterConstants.SoftPii)
.Where(x => x.Position.IsInRange(Client.Character.Position, Radius))
.OrderBy(x => x.Position.GetDistance(Client.Character.Position));
Monster closestPod = await GetClosestPod();
if (closestPod == null)
{
return;
}
await Client.Character.Attack(closestPod);
}
while ((monsters.Count() < 10 || zoneSkill == null) && IsRunning);
if (monsters.Count() < 10)
{
return;
}
await Client.Character.UseSkillOn(zoneSkill, monsters.First());
await Task.Delay(100);
}
}
private async Task<Monster> GetClosestPod()
{
Monster pod;
do
{
pod = Client.Character.Map.Monsters
.Where(x => x.Vnum == MonsterConstants.SoftPiiPod)
.Where(x => x.Position.IsInRange(Client.Character.Position, Radius))
.OrderBy(x => x.Position.GetDistance(Client.Character.Position))
.FirstOrDefault();
await Task.Delay(100);
}
while (pod == null && IsRunning);
return pod;
}
Prerequisites
- .NET Framework 4.7
Contributors
- Roxeez
Special thanks
- Pumba98 for helping me with some C++/RE related stuff
License
This project is licensed under the GPL-3.0 License - see the LICENSE.md file for details
Related Skills
gh-issues
347.6kFetch GitHub issues, spawn sub-agents to implement fixes and open PRs, then monitor and address PR review comments. Usage: /gh-issues [owner/repo] [--label bug] [--limit 5] [--milestone v1.0] [--assignee @me] [--fork user/repo] [--watch] [--interval 5] [--reviews-only] [--cron] [--dry-run] [--model glm-5] [--notify-channel -1002381931352]
node-connect
347.6kDiagnose OpenClaw node connection and pairing failures for Android, iOS, and macOS companion apps
oracle
347.6kBest practices for using the oracle CLI (prompt + file bundling, engines, sessions, and file attachment patterns).
taskflow-inbox-triage
347.6kname: taskflow-inbox-triage description: Example TaskFlow authoring pattern for inbox triage. Use when messages need different treatment based on intent, with some routes notifying immediately, some w
