Seite 1 von 2

Plugin Entwicklung Anleitung

Verfasst: 6. Jul 2011, 15:59
von feldmaus
Hi,

könnt Ihr ein paar Tipps geben wie man mit Eclispe ein Java-Plugin für Euer Programm entwickelt?

Ich gehe mal davon aus das man auf jeden Fall ein File-->New-->Java Projekt erstellt? Und kein Plugin wie RPC oder so?

Wie sollte man das Projekt nennen? Ich frage da ich mich mit Java und Eclipse nicht auskenne (nur C++, Python). Muss ich den Ordner "META-INF" zu meinem Build-Path hinzufügen?

In der MANIFEST.MF steht:

Code: Alles auswählen

Class-Path: lib/helden.jar
Muss ich im Hauptverzeichnis ein Ordner names "lib" erzeugen und dort die helden.jar rein kopieren? Muss ich Eclipse sagen das er die helden.jar starten soll wenn ich auf run/debug gehe? Und wo muss ich das einstellen?

Grüße Markus

Re: Plugin Entwicklung Anleitung

Verfasst: 6. Jul 2011, 20:13
von Zafnir
Hallo Markus,

ich habe gleich mal die Gelegenheit genutzt und neue Unterforen auf gemacht.

Aber zu deinen Fragen:

Wenn Eclipse läuft, dann musst du ein ganz normales "Java-Projekt" erstellen.
Dann machst du ein Rechtsklick auf das Projekt und gehst in die Projekt- "Properties".
In der Liste wählst du dann "Java Build Path" aus un gehst auf den Tab "Libraries".
Dort dann mit "Add External Jar" das Helden.jar auf deinem Rechner auswählen.

Das ist soweit dein Projekt.

Als Einstieg bietet sich an das Kalendar-Plugin auszupacken und die Sourcen und das Manifest in dein Projekt zu holen.
Um das Plugin zu testen, musst du es als Jar exportieren und in das PLugin-Verzeichnis legen oder in der Helden-Software importieren.
Achtung wenn du das Projekt wieder exportieren willst, dann darfst du das Manifest nicht automatisch erstellen lassen, sondern musst das aus dem Plugin nehmen.

Damit kannst du zumindest mal starten können.

MfG Maik

Re: Plugin Entwicklung Anleitung

Verfasst: 7. Jul 2011, 10:11
von feldmaus
Zafnir hat geschrieben:Dort dann mit "Add External Jar" das Helden.jar auf deinem Rechner auswählen.
Ist das das gleiche wie die "class-path" Variable in der Datei "MANIFEST.MF" zu setzen, und wenn ist die Pfad-Angabe dort relativ zum obersten Projekt-Ordner oder kann man auch gezielt externe Ordner ansteuern?

zu dem hört sich das für mich so an, als ob man nicht mit eclipse das Programm starten kann, sondern muss es kompilieren und dann extern starten. Somit kann ich das Plugin dann ja gar nicht unter Eclipse debuggen? Ist das richtig?

Grüße Markus

Re: Plugin Entwicklung Anleitung

Verfasst: 7. Jul 2011, 10:44
von Zafnir
Hallo Markus,

ich glaube du hast den falschen Typ von Projekt ausgewählt.
Ein Plugin-Projekt ist nicht das gleiche wie ein Java-Projekt.

Für das Manifest mach mal ein neuen Beitrag auf.
Und dann kannst du gleich einen Beitrag für die Start-Klasse auf machen :-)

Zum Debuggen mit Ecplise:
Jain, es ist möglich externe Programme wie unser Jar per Eclipse zu starten und dann damit zu debuggen.
da kann cih dir aber nicht weiter helfen, das habe ich noch nicht machen müssen.

Was willst du eigentlich machen?

MfG Maik

Re: Plugin Entwicklung Anleitung

Verfasst: 7. Jul 2011, 11:38
von feldmaus
Ich weiß noch gar nicht in welche Richtung ich rudere :-) Also ich wollte für das Projekt mtexport (exportiert Helden in ein Token-Format für maptool) eine md5sum Methode integrieren, da es von maptool gebraucht wird, derzeit wird eine feste md5 genutzt.

Hierfür brauche ich einen Debugger, damit ich weiß was ich in meinem Code falsch mache. Ich will keinen neuen Weg einschlagen, sondern den der Entwickler die mtexport begonnen haben. Inwiefern die Datei MANIFEST.MF verwendet wird, weiß ich nicht, aber sie ist vorhanden und dort steht auch "Class-Path: lib/helden.jar".

Mach mich weiser :-)

Grüße Markus

Re: Plugin Entwicklung Anleitung

Verfasst: 7. Jul 2011, 11:53
von Zafnir
Hallo Markus,

wie gesagt, du hast ein Plugin-Projekt erstellt, da wird automatisch ein Manifest, eine Plugin.xml und noch ein paar Dateien erstellt die Überflüssig sind.
Erstell einfach nochmal ein "Java-Projekt" und kopier das manifest aus dem kalendar in das META-INF-Verzeichnis.

MfG Maik

Re: Plugin Entwicklung Anleitung

Verfasst: 8. Jul 2011, 11:11
von feldmaus
Hi,

die Entwickler vor mir hatten anscheinend ihre Spähne nicht weg gefegt. Also ich kann debuggen mit den oben genannten Einstellungen, somit fehlt nur noch der Export des Plugins :freu: Also ich habe unter Eclipse "Java Projekt" gewählt.

Grüße Markus

Re: Plugin Entwicklung Anleitung

Verfasst: 5. Okt 2011, 21:04
von CAA
da es so schön in den Thread hier passt:
gibt es eine Dokumentation darüber welche Funktionen wie von einem Plugin angesprochen werden kann (oder kann man außer den Helden "lesen" nichts machen)?
Ich würde zB gerne einen (vorher von einem Server geladenen) Helden einfach an die Heldensoftware weitergeben anstelle ihn in die helden.zip zu schreiben und den user dann die Helden neu laden lassen zu müssen....

Exportieren kannst du indem du:
rechtsklick auf das Projekt machst -> Export ->
java -> JAR file
dort wählst du aus wohin du exportieren willst (Achtung, eclipse braucht in dem Ziel ordner schreibrechte.... wenn die nicht vorhanden sind zeigt er zwar an dass es erfolgreich war, aber du wirkst keine .jar finden)
next
next
[x]use existing manifest from workspace
und dort wählst du dann deine manifest Datei aus.
Finish

Re: Plugin Entwicklung Anleitung

Verfasst: 6. Okt 2011, 03:18
von Eclipse404
Soweit ich weis, kann man per Plugin keine Helden importieren.

mfg Christian

Re: Plugin Entwicklung Anleitung

Verfasst: 6. Okt 2011, 10:26
von Zafnir
Hallo CAA,

irgendwie scheint die Nachfrage nach dem Helden-Austausch doch groß genug zu sein, das leute jetzt eine Eigenlösung bauen :-)

Also Sven hat schon angekündigt das es bald wieder einen Austausch geben wird.
Bei der Entwciklung könntest du mithelfen wenn du dich mit Java auskennst.

Zu deiner eigentlichen Frage:
Es gibt nur wehr wenige Möglichkeiten an einem bestehenden Helden Änderungen vorzunehmen.
Ein kompletter Ex und IMport ist noch nciht vorgesehen, nönnte aber mit etwas vorlauf realisiert werden.

MfG Maik

Re: Plugin Entwicklung Anleitung

Verfasst: 6. Okt 2011, 18:12
von CAA
defeniere auskennen.... ;-)
können ja mal über icq o.ä. schnacken...

Re: Plugin Entwicklung Anleitung

Verfasst: 13. Nov 2011, 13:07
von Arik Beriksson
Da ich keinen eigen Thread aufmachen wollte und der Titel passt, schreibe ich es hier rein.

Die Frage ist auch recht allgemein, finde ich. ;)

Also, ich habe folgendes Problem, ich möchte die Zauber eines ausgewählten Helden in einem neuen Fenster anzeigen lassen um dann Werte zu manipulieren, genauer gesagt ich will diese spontan Modifizieren.

Ich war auch schon mit Maik in Kontakt, danke dafür, das hat mir schon einmal weiter geholfen.

ich fasse mal alles zusammen, auch für andere Neulinge, die eventuell auf die gleichen Probleme stoßen:

als ersten erstelle ich eine Klasse 'HeldenStart' welche HeldenWertePlugin3 implementiert

Code: Alles auswählen

public class HeldenStart implements HeldenWertePlugin3 { 

/* (non-Javadoc)
     * @see helden.plugin.HeldenWertePlugin3#doWork(javax.swing.JFrame, helden.plugin.werteplugin2.PluginHeld2[], helden.plugin.werteplugin3.PluginHeldenWerteWerkzeug3)
     */
    @Override
    public void doWork(JFrame parent, PluginHeld2[] helden, PluginHeldenWerteWerkzeug3 phww){
		new SponModController(parent,helden,phww ); // einfach alles an den Controller weiter reichen
    }
    
    /**
     * Liefert das ImageIcon fuer das Menu
     * @return ImageIcon oder null 
     */
    @Override
	public ImageIcon getIcon() {
        ProtectionDomain currentProtectionDomain = getClass().getProtectionDomain();
        final CodeSource codeSource = currentProtectionDomain.getCodeSource();
        URL icon = AccessController.doPrivileged(new PrivilegedAction<URLClassLoader>() {
			public URLClassLoader run() {
				return new URLClassLoader(new URL[]{codeSource.getLocation()});
			}
		})
            .getResource("sponmod/sponmod.gif"); 
        return new ImageIcon(icon);
    }

    /**
     * Gibt den Namen des Plugins an.
     * Wird verwendet um das Menu auf zu bauen.
     * @return name
     */
    @Override
	public String getMenuName() {
        return "Spontane Modifikation";
    }

    /**
     * Wird angezeigt, wenn die Maus ueber den Menu schwebt.
     * @return tooltip
     */
    @Override
	public String getToolTipText() {
        return "Spontane Modifikation von Zaubern";
    }
    
    /**
     * Gibt helden den Typ dieses Plugins, 
     * das KalenderPlugIn zB ist simple
     * dieses hier muss vom Typ DATEN3 sein,
     * damit wir Zugriff auf phww, frame und helden haben 
    * (siehe Konstruktor)
     * @return DATEN3
     */
    @Override
	public String getType() {
        return DATEN3;
    }

	@Override
	public void doWork(JFrame arg0) {
		new SponModController();
		
	}

}

in meinem Controller habe ich dann u.a. folgendes

Code: Alles auswählen


public class SponModController implements ChangeListener, ActionListener,	WindowListener {

        // globals
        private SponModPanel panel;
	private PluginHeld2[] helden;
	private PluginHeldenWerteWerkzeug3 phww;

	/**
	 * Konstruktor Organisiert den Aufbau der GUI mit Helden
	 * 
	 * @param parent
	 *            Der Helden-Frame
	 */
	public SponModController(JFrame parent, PluginHeld2[] helden, PluginHeldenWerteWerkzeug3 phww) {
		super();
		this.helden = helden;
		this.phww = phww;
		this.panel = new SponModPanel(this);
		JDialog edit = new JDialog(parent, "Spontane Modifikation", true);
		edit.getContentPane().add(panel);
		edit.setSize(300, 200);
		edit.setVisible(true);
		refreshValues();
	}


         /**
	 * @return the zauber
	 */
	public String[][] getZauber() {
                // habe das für debug zwecke in zwei Zeilen auf geteilt. phww ist bei mir korrekt
		PluginHeldenWerteWerkzeug3 temp = this.phww;
		return temp.getZauberAlsString();
	}
und im panel habe ich dann folgendes

Code: Alles auswählen



private String [][] saZauber;

public JTextField getFieldZauber(){
    	String sZauber =String.format("Die Zauber von %s \n", controller.getSelectedHeld());
    	saZauber = controller.getSaZauber();
    	for (int r=0; r<saZauber.length; r++) {
    	     for (int c=0; c<saZauber[r].length; c++) {
    	         sZauber +=" " + saZauber[r][c];
    	     }
    	     sZauber +="\n";
    	 }
    	return new JTextField(sZauber);
    }

Wie man an der letzten Funktion sieht gebe ich den ausgewählten helden mmit aus, das funktioniert, aber
controller.getSaZauber();
liefert nicht 'null', warum denn das?
Der Held hat definitiv Zauber, irgend etwas was ich übersehen habe?
und eigentlich müsste ich doch mit
String sZauber = saZauber[r][0];
String sRepraes = saZauber[r][1];
an den Zauber bzw an die Repraesantation des Zaubers kommen, richtig?

Und wo wir dabei sind
PluginZauber3 pz3 = phww.getZauber(arg0, arg1); // arg0 und arg1 sind Strings, sind das die Werte aus dem 2dim Array?
es wird ja ein PluginZauber3 Objekt zurück gegeben
PluginZauberInfo pzi = controller.getPhww().getZauberInfo(pz3);

und hier komme ich dann an die Reichweite, Kosten, etc, richtig?


vielen Dank schon mal
Dennis

Re: Plugin Entwicklung Anleitung

Verfasst: 14. Nov 2011, 11:57
von Zafnir
Hallo Alrik,

also als erstes must du dir die Liate aller ZauberNamen die der held hat holen.
Dann kannst du abfragen in welchen Repräsentationen der Held den Zauber hat.
uss eine Methode sein String[] get[ZauberRep](String) sein.
Um dann an den Konkreten Zauber zu gelangen musst du dann noch phww.getZauber([ZauberName], [Repräsentation]) aufrufen.

Der PluginZauber3 enthällt dann den wert des Zaubers und weider Informationen wie die Eigenschaften, (oder auch die kommentare, habe im moment die Sourcen nicht zur hand ).

Schau am besten mal ins Java-Doc der Methoden.

MfG Maik

Re: Plugin Entwicklung Anleitung

Verfasst: 16. Nov 2011, 11:27
von Arik Beriksson
Zafnir hat geschrieben:Hallo Alrik,

also als erstes must du dir die Liate aller ZauberNamen die der held hat holen.
Dann kannst du abfragen in welchen Repräsentationen der Held den Zauber hat.
konkret heißt es doch, ich habe vorher schon beim phww. void setAktivenHeld(held);
meinen Helden richtig gesetzt ( den kann ich abfragen und es passt.
Nun kann ich also über phww die Zauber des aktiven Helden abfragen, richtig?

Das einzige was nun der von Dir oben skizzierten Sache am nächsten kommt,
wäre die von mir oben auch schon erwähnte Methode

Code: Alles auswählen

**
     * Gibt die Zauber Strings
     * @return Strings der Zauber [i][0] und die Repraesentation[i][1] 
     *  in der der Zauber beherrschft wird
     * @since 4.7.1
     */
    String[][] getZauberAlsString();
Zafnir hat geschrieben: uss eine Methode sein String[] get[ZauberRep](String) sein.
Um dann an den Konkreten Zauber zu gelangen musst du dann noch phww.getZauber([ZauberName], [Repräsentation]) aufrufen.
genau das meinte ich ja oben mit
Ich hat geschrieben: Und wo wir dabei sind
PluginZauber3 pz3 = phww.getZauber(arg0, arg1); // arg0 und arg1 sind Strings, sind das die Werte aus dem 2dim Array?
es wird ja ein PluginZauber3 Objekt zurück gegeben
PluginZauberInfo pzi = controller.getPhww().getZauberInfo(pz3);

und hier komme ich dann an die Reichweite, Kosten, etc, richtig?
Zafnir hat geschrieben: Der PluginZauber3 enthällt dann den wert des Zaubers und weider Informationen wie die Eigenschaften, (oder auch die kommentare, habe im moment die Sourcen nicht zur hand ).

Schau am besten mal ins Java-Doc der Methoden.

MfG Maik

Wie gesagt in das JavaDoc habe ich geschaut, komme nicht weiter, ich baue mal ein Minimalbeispiel, dachte nur, dass ich irgendetwas grundsätzlich falsch verstanden hatte, denn String[][] getZauberAlsString() liefert bei mir bei einem Gildenmagier null.


Minimal Beispiel und einen Magier mit dem ich das teste befinden sich hier

Re: Plugin Entwicklung Anleitung

Verfasst: 16. Nov 2011, 11:46
von Zafnir
Hallo Arik,

Ich schaue es mir Heute abend mal im Source an.
Du könntest mir dein Plugin mal als Source schicken, dann kann ich gleich daran Debuggen.

MfG Maik