v0.8.1a: tweaked syncing on char sprites to hopefully fix rare deadlocks

This commit is contained in:
Evan Debenham 2020-06-30 21:15:04 -04:00
parent bc757ed57b
commit ea4d45da7f
4 changed files with 70 additions and 63 deletions
core/src/main/java/com/shatteredpixel/shatteredpixeldungeon/sprites

View File

@ -291,10 +291,8 @@ public class CharSprite extends MovieClip implements Tweener.Listener, MovieClip
public void die() {
sleeping = false;
play( die );
if (emo != null) {
emo.killAndErase();
}
hideEmo();
if (health != null){
health.killAndErase();
@ -465,8 +463,7 @@ public class CharSprite extends MovieClip implements Tweener.Listener, MovieClip
}
@Override
//syncronized due to EmoIcon handling
public synchronized void update() {
public void update() {
super.update();
@ -498,8 +495,10 @@ public class CharSprite extends MovieClip implements Tweener.Listener, MovieClip
} else {
hideSleep();
}
if (emo != null && emo.alive) {
emo.visible = visible;
synchronized (EmoIcon.class) {
if (emo != null && emo.alive) {
emo.visible = visible;
}
}
}
@ -511,61 +510,76 @@ public class CharSprite extends MovieClip implements Tweener.Listener, MovieClip
}
}
public synchronized void showSleep() {
if (emo instanceof EmoIcon.Sleep) {
} else {
if (emo != null) {
emo.killAndErase();
public void showSleep() {
synchronized (EmoIcon.class) {
if (!(emo instanceof EmoIcon.Sleep)) {
if (emo != null) {
emo.killAndErase();
}
emo = new EmoIcon.Sleep(this);
emo.visible = visible;
}
emo = new EmoIcon.Sleep( this );
emo.visible = visible;
}
idle();
}
public synchronized void hideSleep() {
if (emo instanceof EmoIcon.Sleep) {
emo.killAndErase();
emo = null;
public void hideSleep() {
synchronized (EmoIcon.class) {
if (emo instanceof EmoIcon.Sleep) {
emo.killAndErase();
emo = null;
}
}
}
public synchronized void showAlert() {
if (emo instanceof EmoIcon.Alert) {
} else {
public void showAlert() {
synchronized (EmoIcon.class) {
if (!(emo instanceof EmoIcon.Alert)) {
if (emo != null) {
emo.killAndErase();
}
emo = new EmoIcon.Alert(this);
emo.visible = visible;
}
}
}
public void hideAlert() {
synchronized (EmoIcon.class) {
if (emo instanceof EmoIcon.Alert) {
emo.killAndErase();
emo = null;
}
}
}
public void showLost() {
synchronized (EmoIcon.class) {
if (!(emo instanceof EmoIcon.Lost)) {
if (emo != null) {
emo.killAndErase();
}
emo = new EmoIcon.Lost(this);
emo.visible = visible;
}
}
}
public void hideLost() {
synchronized (EmoIcon.class) {
if (emo instanceof EmoIcon.Lost) {
emo.killAndErase();
emo = null;
}
}
}
public void hideEmo(){
synchronized (EmoIcon.class) {
if (emo != null) {
emo.killAndErase();
emo = null;
}
emo = new EmoIcon.Alert( this );
emo.visible = visible;
}
}
public synchronized void hideAlert() {
if (emo instanceof EmoIcon.Alert) {
emo.killAndErase();
emo = null;
}
}
public synchronized void showLost() {
if (emo instanceof EmoIcon.Lost) {
} else {
if (emo != null) {
emo.killAndErase();
}
emo = new EmoIcon.Lost( this );
emo.visible = visible;
}
}
public synchronized void hideLost() {
if (emo instanceof EmoIcon.Lost) {
emo.killAndErase();
emo = null;
}
}
@ -573,9 +587,7 @@ public class CharSprite extends MovieClip implements Tweener.Listener, MovieClip
public void kill() {
super.kill();
if (emo != null) {
emo.killAndErase();
}
hideEmo();
for( State s : State.values()){
remove(s);

View File

@ -54,10 +54,7 @@ public class GhoulSprite extends MobSprite {
}
public void crumple(){
if (emo != null){
emo.killAndErase();
emo = null;
}
hideEmo();
play(crumple);
}

View File

@ -81,7 +81,7 @@ public class MimicSprite extends MobSprite {
}
@Override
public synchronized void showSleep() {
public void showSleep() {
if (curAnim == hiding){
return;
}

View File

@ -62,9 +62,7 @@ public class MobSprite extends CharSprite {
angularSpeed = Random.Int( 2 ) == 0 ? -720 : 720;
am = 1;
if (emo != null){
emo.killAndErase();
}
hideEmo();
if (health != null){
health.killAndErase();