Skip to content

Charamel setclothing #248

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 11 commits into
base: master
Choose a base branch
from
12 changes: 11 additions & 1 deletion Changelog.md
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,16 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- The Changelog!
- Plugin `studymaster-web`: new interface to control the flow from web page (#185, #209)
- Plugin `yallah`: to control YALLAH avatars via websocket protocol (#184)
- charamel branch has a new command SetClothing with a style value that change different clothing option for the
charamel chatacter. Different style values:
1. business_closed
2. business_open
3. business_open_shortleg
4. business_closed_shortleg
5. casual
6. casual_skirt

- charamel branch can now move the characters position with PlayAction SetPosition position command.
### Changed
- study-master web has a much longer timeout for websockets
### Removed
Expand All @@ -24,4 +34,4 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
- PlayAction command can now parse floats in scientific format (#230)
### Security

## [4.0.1] - 2020-01-22
## [4.0.1] - 2020-01-22
Original file line number Diff line number Diff line change
Expand Up @@ -227,12 +227,24 @@ public final void execute(final AbstractActivity activity) {
String style = activity.get("style");
style = (style == null) ? "" : style;
charamelAct = mActionLoader.loadCharamelAnimation(activity_name, aid, style);
} else if (activity_name.equalsIgnoreCase("SetPosition")) {
String xpos = activity.get("x");
xpos = (xpos == null) ? "" : xpos;
String ypos = activity.get("y");
ypos = (ypos == null) ? "" : ypos;
String zpos = activity.get("z");
zpos = (zpos == null) ? "" : zpos;
String xorient = activity.get("xorient");
xorient = (xorient == null) ? "" : xorient;
String yorient = activity.get("yorient");
yorient = (yorient == null) ? "" : yorient;
String zorient = activity.get("zorient");
zorient = (zorient == null) ? "" : zorient;
charamelAct = mActionLoader.loadCharamelAnimation(activity_name, aid, xpos, ypos, zpos, xorient, yorient, zorient);
} else if (activity_name.equalsIgnoreCase("HideAvatar")) {
charamelAct = mActionLoader.loadCharamelAnimation(activity_name, aid);
} else if (activity_name.equalsIgnoreCase("GetCamera")) {
charamelAct = mActionLoader.loadCharamelAnimation(activity_name, aid);
} else if (activity_name.equalsIgnoreCase("SittingStart")) {
charamelAct = mActionLoader.loadCharamelAnimation(activity_name, aid);
} else if (activity_name.equalsIgnoreCase("SittingSop")) {
charamelAct = mActionLoader.loadCharamelAnimation(activity_name, aid);
} else if (activity_name.equalsIgnoreCase("StopSpeaking")) {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,12 +1,6 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package de.dfki.vsm.xtension.charamel.xml.command.object.action.charamel;

import de.dfki.vsm.util.ios.IOSIndentWriter;
import de.dfki.vsm.util.log.LOGConsoleLogger;
import de.dfki.vsm.util.xml.XMLParseError;
import de.dfki.vsm.util.xml.XMLParseable;
import de.dfki.vsm.util.xml.XMLWriteError;
Expand All @@ -18,9 +12,6 @@
* @author Patrick Gebhard
*/
public class SetClothing extends CharamelActObject implements XMLParseable, XMLWriteable {

// The logger instance
private final LOGConsoleLogger mLogger = LOGConsoleLogger.getInstance();
private String mCharameAvatarId = "1";
private String mCharacterClothing = "business_open_shortleg";

Expand All @@ -38,7 +29,7 @@ public SetClothing() {
public void writeXML(IOSIndentWriter out) throws XMLWriteError {
out.push().println("<Action name=\"" + mName + "\" id=\"" + mId + "\">").push();
out.push().println("<cai_request version=\"1.0\">");
out.push().println("<cai_command>RenderXML");
out.push().println("<cai_command id=\"" + mId + "\">RenderXML");
out.push().println("<animation_track>");
out.push().println("<event aid='" + mCharameAvatarId + "'>SetClothing");
out.println("<event_param>" + mCharacterClothing + "</event_param>");
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,57 @@
package de.dfki.vsm.xtension.charamel.xml.command.object.action.charamel;

import de.dfki.vsm.util.ios.IOSIndentWriter;
import de.dfki.vsm.util.xml.XMLParseError;
import de.dfki.vsm.util.xml.XMLParseable;
import de.dfki.vsm.util.xml.XMLWriteError;
import de.dfki.vsm.util.xml.XMLWriteable;
import de.dfki.vsm.xtension.charamel.xml.command.object.action.CharamelActObject;
import org.w3c.dom.Element;

/**
* @author Patrick Gebhard
*/
public class SetPosition extends CharamelActObject implements XMLParseable, XMLWriteable {

private String mCharameAvatarId = "1";
private int mXPos = 0;
private int mYPos = 0;
private int mZPos = 0;

private int mXOrient = 0;
private int mYOrient = 0;
private int mZOrient = 0;

public SetPosition(String aid, String xpos, String ypos, String zpos, String xorient, String yorient, String zorient) {
mName = "caixml";
mCharameAvatarId = aid;
mXPos = Integer.parseInt(xpos);
mYPos = Integer.parseInt(ypos);
mZPos = Integer.parseInt(zpos);
mXOrient = Integer.parseInt(xorient);
mYOrient = Integer.parseInt(yorient);
mZOrient = Integer.parseInt(zorient);
}

public SetPosition() {
mName = "caixml";
}

@Override
public void writeXML(IOSIndentWriter out) throws XMLWriteError {
out.push().println("<Action name=\"" + mName + "\" id=\"" + mId + "\">").push();
out.push().println("<cai_request version=\"1.0\">");
out.push().println("<cai_command id=\"" + mId + "\">SetAvatarPositionXML");
out.push().println("<position x=\"" + mXPos + "\" y=\"" + mYPos + "\" z=\"" + mZPos + "\"></position>");
out.push().println("<orientation x=\"" + mXOrient + "\" y=\"" + mYOrient + "\" z=\"" + mZOrient + "\"></orientation>");
out.pop().println("</cai_command>");
out.pop().println("</cai_request>");
out.pop().pop().println("</Action>");
}

@Override
public void parseXML(final Element element) throws XMLParseError {
mName = element.getAttribute("name");
mId = element.getAttribute("id");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,16 +7,16 @@

import de.dfki.vsm.util.log.LOGConsoleLogger;
import de.dfki.vsm.xtension.charamel.xml.command.object.action.CharamelActObject;

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.util.LinkedList;

/**
*
* @author Patrick Gebhard
*
*/
public class CharamelActionLoader {
public class
CharamelActionLoader {

public final static String sCHARAMELCMDPATH = "de.dfki.vsm.xtension.charamel.xml.command.object.action.charamel";
private static CharamelActionLoader sInstance = null;
Expand Down Expand Up @@ -54,64 +54,8 @@ private String getCharamelCommandClasspath(String cmd) {
return classPath;
}

public CharamelActObject loadCharamelAnimation(String cmd, String value1) {
CharamelActObject a = null;

String cp = getCharamelCommandClasspath(cmd);

try {
Class c = Class.forName(cp);
Constructor[] constructors = c.getConstructors();
for (Constructor con : constructors) {
Class[] params = con.getParameterTypes();
if (params.length == 1) {
if (params[0].getSimpleName().equalsIgnoreCase("string")) {
a = (CharamelActObject) c.getDeclaredConstructor(params).newInstance(value1);
}
}

}
} catch (ClassNotFoundException | NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
mLogger.failure("No Class for Charamel Action " + cmd + " and avatar id " + value1);
}

if (a != null) {
a.setId(getNextID());
}

return a;
}

public CharamelActObject loadCharamelAnimation(String cmd, String value1, String value2) {
CharamelActObject a = null;

String cp = getCharamelCommandClasspath(cmd);

try {
Class c = Class.forName(cp);
Constructor[] constructors = c.getConstructors();
for (Constructor con : constructors) {
Class[] params = con.getParameterTypes();
if (params.length == 2) {
if (params[0].getSimpleName().equalsIgnoreCase("string") && params[1].getSimpleName().equalsIgnoreCase("string")) {
a = (CharamelActObject) c.getDeclaredConstructor(params).newInstance(value1, value2);
}
}

}
} catch (ClassNotFoundException | NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
mLogger.failure("No Class for Charamel Action " + cmd + " and value " + value1 + ", " + value2);
}

if (a != null) {
a.setId(getNextID());
}

return a;
}

public CharamelActObject buildCharamelAnimation(String cmd, LinkedList value1, String value2, String value3) {
CharamelActObject a = null;
CharamelActObject a = null;

String cp = getCharamelCommandClasspath(cmd);

Expand All @@ -137,103 +81,40 @@ public CharamelActObject buildCharamelAnimation(String cmd, LinkedList value1, S

return a;
}

public CharamelActObject loadCharamelAnimation(String cmd, String value1, String value2, String value3, String value4) {
CharamelActObject a = null;

String cp = getCharamelCommandClasspath(cmd);
public CharamelActObject loadCharamelAnimation(String cmd, String... values) {
CharamelActObject charamelActObject = null;

try {
Class c = Class.forName(cp);
Constructor[] constructors = c.getConstructors();
for (Constructor con : constructors) {
Class[] params = con.getParameterTypes();
if (params.length == 4) {
if (params[0].getSimpleName().equalsIgnoreCase("string") && params[1].getSimpleName().equalsIgnoreCase("string") && params[2].getSimpleName().equalsIgnoreCase("string") && params[3].getSimpleName().equalsIgnoreCase("string")) {
a = (CharamelActObject) c.getDeclaredConstructor(params).newInstance(value1, value2, value3, value4);
}
}

}
} catch (ClassNotFoundException | NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
mLogger.failure("No Class for Charamel Action " + cmd + " and value " + value1 + " , " + value2 + " , " + value3 + " , " + value4);
}

if (a != null) {
a.setId(getNextID());
}

return a;
}

public CharamelActObject loadCharamelAnimation(String cmd, String value1, String value2, String value3, String value4, String value5, String value6) {
CharamelActObject a = null;

String cp = getCharamelCommandClasspath(cmd);
String charamelCommandClasspath = getCharamelCommandClasspath(cmd);

try {
Class c = Class.forName(cp);
Class c = Class.forName(charamelCommandClasspath);
Constructor[] constructors = c.getConstructors();
for (Constructor con : constructors) {
Class[] params = con.getParameterTypes();
if (params.length == 6) {
if (params[0].getSimpleName().equalsIgnoreCase("string") &&
params[1].getSimpleName().equalsIgnoreCase("string") &&
params[2].getSimpleName().equalsIgnoreCase("string") &&
params[3].getSimpleName().equalsIgnoreCase("string") &&
params[4].getSimpleName().equalsIgnoreCase("string") &&
params[5].getSimpleName().equalsIgnoreCase("string")) {
a = (CharamelActObject) c.getDeclaredConstructor(params).newInstance(value1, value2, value3, value4, value5, value6);
if (params.length == values.length) {
boolean b = true;
for (Class param : params) {
if (!param.getSimpleName().equalsIgnoreCase("string")) {
b = false;
break;
}
}
}

}
} catch (ClassNotFoundException | NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
mLogger.failure("No Class for Charamel Action " + cmd + " and value " + value1 + " , " + value2 + " , " + value3 + " , " + value4 + " , " + value5 + " , " + value6);
}

if (a != null) {
a.setId(getNextID());
}

return a;
}

public CharamelActObject loadCharamelAnimation(String cmd, String value1, String value2, String value3, String value4, String value5, String value6, String value7, String value8, String value9, String value10) {
CharamelActObject a = null;

String cp = getCharamelCommandClasspath(cmd);

try {
Class c = Class.forName(cp);
Constructor[] constructors = c.getConstructors();
for (Constructor con : constructors) {
Class[] params = con.getParameterTypes();
if (params.length == 10) {
if (params[0].getSimpleName().equalsIgnoreCase("string") &&
params[1].getSimpleName().equalsIgnoreCase("string") &&
params[2].getSimpleName().equalsIgnoreCase("string") &&
params[3].getSimpleName().equalsIgnoreCase("string") &&
params[4].getSimpleName().equalsIgnoreCase("string") &&
params[5].getSimpleName().equalsIgnoreCase("string") &&
params[6].getSimpleName().equalsIgnoreCase("string") &&
params[7].getSimpleName().equalsIgnoreCase("string") &&
params[8].getSimpleName().equalsIgnoreCase("string") &&
params[9].getSimpleName().equalsIgnoreCase("string")) {
a = (CharamelActObject) c.getDeclaredConstructor(params).newInstance(value1, value2, value3, value4, value5, value6,value7,value8,value9,value10);
if (b) {
charamelActObject = (CharamelActObject) c.getDeclaredConstructor(params).newInstance(values);
}
}

}
} catch (ClassNotFoundException | NoSuchMethodException | SecurityException | InstantiationException | IllegalAccessException | IllegalArgumentException | InvocationTargetException ex) {
mLogger.failure("No Class for Charamel Action " + cmd + " and value " + value1 + " , " + value2 + " , " + value3 + " , " + value4 + " , " + value5 + " , " + value6+" , " + value7+" , " + value8+" , " + value9+" , " + value10);
mLogger.failure("No Class for Charamel Action " + cmd + " and value " + String.join(", ", values));
}

if (a != null) {
a.setId(getNextID());
if (charamelActObject != null) {
charamelActObject.setId(getNextID());
}

return a;
return charamelActObject;
}

}