Forlage zu Erweiterte Befehle
Re: Forlage zu Erweiterte Befehle
Keine Sorge in Entwicklung werde ich sicher auch noch tätig, so viele Baustellen wie es in Fantasya gibt. Aber erstmal an kleinen Projekten Java lernen.
Re: Forlage zu Erweiterte Befehle
Hier ein kurzes update. Eigentlich wollte ich heut morgen schon #forst und #herde erledigt haben, aber Magellan, oder genauer die getResourceAmount() method verarscht mich. Daher erstmal nur eine gestreamlinte Variante des bisherigen:
Solltet ihr Fehler finden, oder herausfinden warum diese eine verf... line nicht geht, wäre ich über eine Rückmeldung sehr dankbar:
Fehler den ich kriege ist:
Code: Alles auswählen
// mOrdersauswertung
String regex = "(?<mPrefix>// #)(?<mOrder>[A-Za-z_]{3,10})(?<mCounter>[\\d]{0,4})(?<mSubOrders>.*$)?";
Pattern p = Pattern.compile(regex);
Matcher m;
for (Region region : world.regions().values()) {
for (Unit unit : region.units()) {
int index = 0;
for (String subOrder : unit.getOrders()) {
m = p.matcher(subOrder);
if (m.find()) {
String mPrefix = m.group("mPrefix");
String mOrder = m.group("mOrder");
int mCounter = 0;
if (!(m.group("mCounter").isEmpty()))
mCounter = Integer.parseInt(m.group("mCounter"));
String mSubOrders = m.group("mSubOrders");
ArrayList mOrdersListe = new ArrayList();
switch (mOrder) {
case "efficency":
eff = mCounter;
break;
case "magbest":
if (!unit.isOrdersConfirmed()) {
unit.setOrdersConfirmed(true);
}
case "immer":
if (mSubOrders.contains(":")) {
for (String so : mSubOrders.split(":"))
mOrdersListe.add(so.trim());
} else {
mOrdersListe.add(mSubOrders.trim());
}
break;
case "next":
mCounter--;
unit.removeOrderAt(index);
if (mCounter > 0) {
mOrdersListe.add(mPrefix + mOrder + mCounter + mSubOrders);
} else {
if (mSubOrders.contains(":")) {
for (String so : mSubOrders.split(":"))
mOrdersListe.add(so.trim());
} else {
mOrdersListe.add(mSubOrders.trim());
}
}
break;
case "mal":
mCounter--;
unit.removeOrderAt(index);
if (mCounter > 0) {
mOrdersListe.add(mPrefix + mOrder + mCounter + mSubOrders);
if (mSubOrders.contains(":")) {
for (String so : mSubOrders.split(":"))
mOrdersListe.add(so.trim());
} else {
mOrdersListe.add(mSubOrders.trim());
}
}
break;
case "rotate":
mCounter++;
String[] mso = mSubOrders.split(":");
int numRotate = mso.length;
if (mCounter > numRotate) mCounter = 1;
unit.removeOrderAt(index);
mOrdersListe.add(mPrefix + mOrder + mCounter + mSubOrders);
int i = 1;
for (String so : mso) {
if (i == mCounter) mOrdersListe.add(so.trim());
i++;
}
break;
default:
}
unit.addOrders(mOrdersListe);
}
index++;
}
}
}
Code: Alles auswählen
int rTrees = unit.getRegion().getResourceAmount("Holz");
Fehler bei der Ausführung
Sourced file: inline evaluation of: ``import magellan.client.*; import magellan.client.extern.*; import magellan.libra . . . '' : Typed variable declaration : Error in method invocation: Method getResourceAmount( java.lang.String ) not found in class'magellan.library.impl.MagellanRegionImpl'
Sourced file: inline evaluation of: ``import magellan.client.*; import magellan.client.extern.*; import magellan.libra . . . '' : Typed variable declaration : Error in method invocation: Method getResourceAmount( java.lang.String ) not found in class'magellan.library.impl.MagellanRegionImpl' : at Line: 84 : in file: inline evaluation of: ``import magellan.client.*; import magellan.client.extern.*; import magellan.libra . . . '' : .getResourceAmount ( "Holz" )
Re: Forlage zu Erweiterte Befehle
Soo, ich denke ich hab den Fehler isoliert... ich versteh nur nicht warum er passiert:
Der obere Code funktioniert, der untere nicht. Anscheinend verhaspelt sich die folgende Funktion (Magellan 2, ExtendedCommandsHelper.java):
Versteht jemand was da los ist?
Code: Alles auswählen
int rTrees = unit.getRegion().getResource(region.data.getRules().getItemType(StringID.create("Holz"))).getAmount();
// int rTrees = unit.getRegion().getResource(region.data.getRules().getItemType("Holz")).getAmount();
Code: Alles auswählen
public ItemType getItemType(String typeName) {
return world.getRules().getItemType(StringID.create(typeName));
}
Re: Forlage zu Erweiterte Befehle
Die momentane Variante des #forst Befehls, sowie der neue #efficiency Befehl:
Code: Alles auswählen
// mOrdersauswertung
String regex = "(?<mPrefix>// #)(?<mOrder>[A-Za-z_]{3,10})(?<mCounter>[\\d]{0,4})(?<mSubOrders>.*$)?";
Pattern p = Pattern.compile(regex);
Matcher m;
int eff = 100;
for (Region region : world.regions().values()) {
for (Unit unit : region.units()) {
int index = 0;
for (String subOrder : unit.getOrders()) {
m = p.matcher(subOrder);
if (m.find()) {
String mPrefix = m.group("mPrefix");
String mOrder = m.group("mOrder");
int mCounter = 0;
if (!(m.group("mCounter").isEmpty()))
mCounter = Integer.parseInt(m.group("mCounter"));
String mSubOrders = m.group("mSubOrders");
ArrayList mOrdersListe = new ArrayList();
switch (mOrder) {
case "efficency":
eff = mCounter;
break;
case "magbest":
if (!unit.isOrdersConfirmed()) {
unit.setOrdersConfirmed(true);
}
case "immer":
if (mSubOrders.contains(":")) {
for (String so : mSubOrders.split(":"))
mOrdersListe.add(so.trim());
} else {
mOrdersListe.add(mSubOrders.trim());
}
break;
case "next":
mCounter--;
unit.removeOrderAt(index);
if (mCounter > 0) {
mOrdersListe.add(mPrefix + mOrder + mCounter + mSubOrders);
} else {
if (mSubOrders.contains(":")) {
for (String so : mSubOrders.split(":"))
mOrdersListe.add(so.trim());
} else {
mOrdersListe.add(mSubOrders.trim());
}
}
break;
case "mal":
mCounter--;
unit.removeOrderAt(index);
if (mCounter > 0) {
mOrdersListe.add(mPrefix + mOrder + mCounter + mSubOrders);
if (mSubOrders.contains(":")) {
for (String so : mSubOrders.split(":"))
mOrdersListe.add(so.trim());
} else {
mOrdersListe.add(mSubOrders.trim());
}
}
break;
case "rotate":
mCounter++;
String[] mso = mSubOrders.split(":");
int numRotate = mso.length;
if (mCounter > numRotate)
mCounter = 1;
unit.removeOrderAt(index);
mOrdersListe.add(mPrefix + mOrder + mCounter + mSubOrders);
int i = 1;
for (String so : mso) {
if (i == mCounter)
mOrdersListe.add(so.trim());
i++;
}
break;
case "forst":
int rTrees = unit.getRegion()
.getResource(region.data.getRules().getItemType(StringID.create("Holz")))
.getAmount();
int uCap = helper.getLevel(unit, "Holzfällen") * unit.getPersons();
if ((int) (0.01 * (uCap * eff + mCounter)) >= rTrees) {
mOrdersListe.add("MACHE " + (rTrees - mCounter) + " Holz");
} else {
mOrdersListe.add(mSubOrders.trim());
}
break;
default:
}
unit.addOrders(mOrdersListe);
}
index++;
}
}
}
Re: Forlage zu Erweiterte Befehle
Und nächste Version, jetzt gehen beide Varianten von Forlage. Kompatibilität wieder gewahrt, dafür ist efficiency/auslastung wirkungslos.
Hier wäre ich euch für Rückmeldungen dankbar. Braucht ihr eine Möglichkeit eine % Grenze der Minimalauslastung für Einheiten zu setzen, oder wollt ihr es lieber so wie bei forlage, das man eine Ober- und Untergrenze als Ganzzahl setzt?
Hier wäre ich euch für Rückmeldungen dankbar. Braucht ihr eine Möglichkeit eine % Grenze der Minimalauslastung für Einheiten zu setzen, oder wollt ihr es lieber so wie bei forlage, das man eine Ober- und Untergrenze als Ganzzahl setzt?
Code: Alles auswählen
// mOrdersauswertung
String regex = "(?<mPrefix>// #)(?<mOrder>[A-Za-z_]{3,10})\\u0020?(?<mCounter>[\\d]{0,4})\\u0020(?<mCounter2>[\\d]{0,4})\\u0020?(?<mSubOrders>.*$)?";
Pattern p = Pattern.compile(regex);
Matcher m;
int eff = 100;
for (Region region : world.regions().values()) {
for (Unit unit : region.units()) {
int index = 0;
for (String subOrder : unit.getOrders()) {
m = p.matcher(subOrder);
if (m.find()) {
String mPrefix = m.group("mPrefix");
String mOrder = m.group("mOrder");
int mCounter = 0;
if (!(m.group("mCounter").isEmpty()))
mCounter = Integer.parseInt(m.group("mCounter"));
String mSubOrders = m.group("mSubOrders");
ArrayList mOrdersListe = new ArrayList();
switch (mOrder) {
case "auslastung":
eff = mCounter;
break;
case "magbest":
if (!unit.isOrdersConfirmed()) {
unit.setOrdersConfirmed(true);
}
case "immer":
if (mSubOrders.contains(":")) {
for (String so : mSubOrders.split(":"))
mOrdersListe.add(so.trim());
} else {
mOrdersListe.add(mSubOrders.trim());
}
break;
case "next":
mCounter--;
unit.removeOrderAt(index);
if (mCounter > 0) {
mOrdersListe.add(mPrefix + mOrder + " " + mCounter + " " + mSubOrders);
} else {
if (mSubOrders.contains(":")) {
for (String so : mSubOrders.split(":"))
mOrdersListe.add(so);
} else {
mOrdersListe.add(mSubOrders);
}
}
break;
case "mal":
mCounter--;
unit.removeOrderAt(index);
if (mCounter > 0) {
mOrdersListe.add(mPrefix + mOrder + " " + mCounter + " " + mSubOrders);
if (mSubOrders.contains(":")) {
for (String so : mSubOrders.split(":"))
mOrdersListe.add(so);
} else {
mOrdersListe.add(mSubOrders);
}
}
break;
case "rotate":
mCounter++;
String[] mso = mSubOrders.split(":");
int numRotate = mso.length;
if (mCounter > numRotate)
mCounter = 1;
unit.removeOrderAt(index);
mOrdersListe.add(mPrefix + mOrder + " " + mCounter + " " + mSubOrders);
int i = 1;
for (String so : mso) {
if (i == mCounter)
mOrdersListe.add(so);
i++;
}
break;
case "forst":
int rTrees = unit.getRegion()
.getResource(region.data.getRules().getItemType(StringID.create("Holz")))
.getAmount();
int mCounter2 = -1;
if (!(m.group("mCounter2").isEmpty()))
mCounter2 = Integer.parseInt(m.group("mCounter2"));
int uCap = helper.getLevel(unit, "Holzfällen") * unit.getPersons();
int fellTrees = 0;
// int fellTrees = (mCounter2 > 0) ?
// ((mCounter2-mCounter)>uCap) ?
// uCap : mCounter2-mCounter : (rTrees>mCounter) ?
// rTrees-mCounter : 0;
if (mCounter2 > 0) {
if (rTrees > mCounter2) {
if ((mCounter2 - mCounter) > uCap) {
fellTrees = uCap;
} else {
fellTrees = mCounter2 - mCounter;
}
}
} else {
if (rTrees > mCounter) {
fellTrees = rTrees - mCounter;
}
}
if (fellTrees > 0) {
mOrdersListe.add("MACHE " + fellTrees + " Holz");
} else {
mOrdersListe.add(mSubOrders);
}
break;
default:
}
unit.addOrders(mOrdersListe);
}
index++;
}
}
}
Re: Forlage zu Erweiterte Befehle
Und das nächste Update, diesmal inkl. #herde. Kleine Abweichung zu #forlage: Trenner ist : nicht |. Hintergrund ist eine von mir beabsichtigte Vereinheitlichung (forlage verwendet überall : um Unterbefehle zu trennen. Wer | verwenden will... einfach das Zeichen im Split austauschen.
PS: weder #forst noch #herde berücksichtigen bisher Gebäude. Dies baue ich ein, sobald ich die passende Funktion ausgegraben habe.
PS: weder #forst noch #herde berücksichtigen bisher Gebäude. Dies baue ich ein, sobald ich die passende Funktion ausgegraben habe.
Code: Alles auswählen
import magellan.client.*;
import magellan.client.extern.*;
import magellan.library.*;
import magellan.library.rules.*;
import magellan.plugin.extendedcommands.*;
import java.util.ArrayList;
import java.util.regex.*;
// mOrdersauswertung
String regex = "(?<mPrefix>// #)(?<mOrder>[A-Za-z_]{3,10})\\u0020?(?<mCounter>[\\d]{0,4})\\u0020(?<mCounter2>[\\d]{0,4})\\u0020?(?<mSubOrders>.*$)?";
Pattern p = Pattern.compile(regex);
Matcher m;
int eff = 100;
for (Region region : world.regions().values()) {
for (Unit unit : region.units()) {
int index = 0;
for (String subOrder : unit.getOrders()) {
m = p.matcher(subOrder);
if (m.find()) {
String mPrefix = m.group("mPrefix");
String mOrder = m.group("mOrder");
int mCounter = 0;
if (!(m.group("mCounter").isEmpty()))
mCounter = Integer.parseInt(m.group("mCounter"));
String mSubOrders = m.group("mSubOrders");
ArrayList mOrdersListe = new ArrayList();
switch (mOrder) {
case "auslastung":
eff = mCounter;
break;
case "magbest":
if (!unit.isOrdersConfirmed()) {
unit.setOrdersConfirmed(true);
}
case "immer":
if (mSubOrders.contains(":")) {
for (String so : mSubOrders.split(":"))
mOrdersListe.add(so.trim());
} else {
mOrdersListe.add(mSubOrders.trim());
}
break;
case "next":
mCounter--;
unit.removeOrderAt(index);
if (mCounter > 0) {
mOrdersListe.add(mPrefix + mOrder + " " + mCounter + " " + mSubOrders);
} else {
if (mSubOrders.contains(":")) {
for (String so : mSubOrders.split(":"))
mOrdersListe.add(so);
} else {
mOrdersListe.add(mSubOrders);
}
}
break;
case "mal":
mCounter--;
unit.removeOrderAt(index);
if (mCounter > 0) {
mOrdersListe.add(mPrefix + mOrder + " " + mCounter + " " + mSubOrders);
if (mSubOrders.contains(":")) {
for (String so : mSubOrders.split(":"))
mOrdersListe.add(so);
} else {
mOrdersListe.add(mSubOrders);
}
}
break;
case "rotate":
mCounter++;
String[] mso = mSubOrders.split(":");
int numRotate = mso.length;
if (mCounter > numRotate)
mCounter = 1;
unit.removeOrderAt(index);
mOrdersListe.add(mPrefix + mOrder + " " + mCounter + " " + mSubOrders);
int i = 1;
for (String so : mso) {
if (i == mCounter)
mOrdersListe.add(so);
i++;
}
break;
case "forst":
int rTrees = unit.getRegion()
.getResource(region.data.getRules().getItemType(StringID.create("Holz")))
.getAmount();
int mCounter2 = -1;
if (!(m.group("mCounter2").isEmpty()))
mCounter2 = Integer.parseInt(m.group("mCounter2"));
int uCapWood = helper.getLevel(unit, "Holzfällen") * unit.getPersons();
int fellTrees = 0;
if (mCounter2 > 0) {
if (rTrees > mCounter2) {
if ((mCounter2 - mCounter) > uCapWood) {
fellTrees = uCapWood;
} else {
fellTrees = mCounter2 - mCounter;
}
}
} else {
if (rTrees > mCounter) {
fellTrees = rTrees - mCounter;
}
}
if (fellTrees > 0) {
mOrdersListe.add("MACHE " + fellTrees + " Holz");
} else {
mOrdersListe.add(mSubOrders);
}
break;
case "herde":
String mAnimSO;
String mAnim;
int uCapAnimal = helper.getLevel(unit, "Pferdedressur") * unit.getPersons();
int herdAnimals = 0;
for (String so : mSubOrders.split(":")) {
String animRegex = "(?i)(?<mAnim>pferd|kamel|elefant|zotte|alpaka|mastodon)\\u0020(?<mAnimC1>[\\d]{1,4})\\u0020(?<mAnimC2>[\\d]{1,4})?\\u0020?(?<mAnimSO>.*$)?";
Pattern animP = Pattern.compile(animRegex);
Matcher animM;
animM = animP.matcher(so);
if (animM.find()) {
mAnim = animM.group("mAnim");
int rHerd = unit.getRegion().getResource(region.data.getRules().getItemType(StringID.create(mAnim))).getAmount();
int mAnimC1 = Integer.parseInt(animM.group("mAnimC1"));
int mAnimC2 = (animM.group("mAnimC2") != null) ? Integer.parseInt(animM.group("mAnimC2")) : mAnimC1;
if (rHerd > mAnimC2) {
String s = mAnim.toLowerCase();
int eFactor = (s.contains("elefant") || s.contains("mastodon")) ? 2 : 1;
herdAnimals = Math.min((int)(uCapAnimal/eFactor), rHerd - mAnimC2);
break;
}
}
}
if (herdAnimals > 0) {
mOrdersListe.add("MACHE " + herdAnimals + " " + mAnim);
} else {
mOrdersListe.add(mAnimSO);
}
break;
default:
}
unit.addOrders(mOrdersListe);
}
index++;
}
}
}
Re: Forlage zu Erweiterte Befehle
unit.getBuilding().getBuildingType()
...
und ich finde den sourcecode immernoch nicht...
...
und ich finde den sourcecode immernoch nicht...
I may go pop -- Excuse me!
Re: Forlage zu Erweiterte Befehle
Fehler gefunden.Tsaria hat geschrieben:Solltet ihr Fehler finden, oder herausfinden warum diese eine verf... line nicht geht, wäre ich über eine Rückmeldung sehr dankbar:
War meiner.
der korrekte Aufruf geht über
helper.getResourceAmount("Holz")
... werde das gleich im Workshop korrigieren.
I may go pop -- Excuse me!
Re: Forlage zu Erweiterte Befehle
Gibt bei mir eine Null Pointer Exception. Habs so versucht:
Code: Alles auswählen
int rTrees = helper.getResourceAmount("Holz");
Wer ist online?
Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast