From: <jo...@us...> - 2014-08-13 15:56:48
|
Revision: 9542 http://sourceforge.net/p/planeshift/code/9542 Author: joelyon Date: 2014-08-13 15:56:37 +0000 (Wed, 13 Aug 2014) Log Message: ----------- implemented flash, warn and danger nodes and attributes in pawsprogressmeter xml Modified Paths: -------------- trunk/data/gui/infowindow.xml trunk/src/client/gui/pawsdndbutton.cpp trunk/src/client/gui/shortcutwindow.cpp trunk/src/common/paws/pawsprogressbar.cpp trunk/src/common/paws/pawsprogressbar.h Modified: trunk/data/gui/infowindow.xml =================================================================== --- trunk/data/gui/infowindow.xml 2014-08-13 14:56:28 UTC (rev 9541) +++ trunk/data/gui/infowindow.xml 2014-08-13 15:56:37 UTC (rev 9542) @@ -18,9 +18,14 @@ </attachpoints> <widget name="My HP" factory="pawsProgressBar" tooltip="Health"> +<!-- + <flash level="0.20" low="true" r="0" g="0" b="0" rate="250" /> + <warn level="0.30" low="true" r="200" g="200" b="0" /> + <danger level="0.10" low="true" r="200" g="0" b="0" /> +--> <frame x="0" y="5" width="170" height="10" border="no" /> - <color r="150" g="20" b="20" /> - <fadecolor r="200" g="50" b="50" /> + <color r="20" g="150" b="20" /> + <fadecolor r="200" g="50" b="50" /> <subscriptions> <subscribe data="fVitalValue0:Self" /> </subscriptions> @@ -54,9 +59,14 @@ </widget> <widget name="My Mana" factory="pawsProgressBar" tooltip="Mana"> +<!-- + <flash level="0.20" low="true" r="0" g="0" b="0" rate="250" /> + <warn level="0.30" low="true" r="200" g="200" b="0" /> + <danger level="0.10" low="true" r="200" g="0" b="0" /> +--> <frame x="0" y="27" width="170" height="10" border="no" /> - <color r="20" g="20" b="160" /> - <fadecolor r="50" g="50" b="200" /> + <color r="20" g="20" b="160" /> + <fadecolor r="50" g="50" b="200" /> <subscriptions> <subscribe data="fVitalValue1:Self" /> </subscriptions> Modified: trunk/src/client/gui/pawsdndbutton.cpp =================================================================== --- trunk/src/client/gui/pawsdndbutton.cpp 2014-08-13 14:56:28 UTC (rev 9541) +++ trunk/src/client/gui/pawsdndbutton.cpp 2014-08-13 15:56:37 UTC (rev 9542) @@ -230,9 +230,10 @@ spellProgress->SetTotalValue(1.0); spellProgress->SetColor( 0, 0, 200 ); - spellProgress->SetWarning(warnLevel, warnLow, 200, 200, 0 ); - spellProgress->SetDanger(dangerLevel, warnLow, 200, 0, 0 ); - spellProgress->SetFlash(flashLevel, warnLow, 250, 0, 0, 0 ); + spellProgress->SetWarningLevel(warnLevel, warnLow); + spellProgress->SetDangerLevel(dangerLevel, warnLow); + spellProgress->SetFlashLevel(flashLevel, warnLow); + spellProgress->SetFlashRate( 250); float currentProgress = (currentTicks-startTicks)/duration; spellProgress->SetCurrentValue(currentProgress); Modified: trunk/src/client/gui/shortcutwindow.cpp =================================================================== --- trunk/src/client/gui/shortcutwindow.cpp 2014-08-13 14:56:28 UTC (rev 9541) +++ trunk/src/client/gui/shortcutwindow.cpp 2014-08-13 15:56:37 UTC (rev 9542) @@ -1260,7 +1260,7 @@ { if( main_hp ) { - main_hp->SetWarning(val,true,200,200,0); + main_hp->SetWarningLevel(val,true); } } float pawsShortcutWindow::GetHPWarnLevel() @@ -1276,7 +1276,7 @@ { if( main_hp ) { - main_hp->SetDanger(val,true,250,0,0); + main_hp->SetDangerLevel(val,true); } } float pawsShortcutWindow::GetHPDangerLevel() @@ -1292,7 +1292,8 @@ { if( main_hp ) { - main_hp->SetFlash(val,true,200,0,0,0); + main_hp->SetFlashLevel(val,true); + main_hp->SetFlashRate(200); } } float pawsShortcutWindow::GetHPFlashLevel() @@ -1308,7 +1309,7 @@ { if( main_mana ) { - main_mana->SetWarning(val,true,200,200,200); + main_mana->SetWarningLevel(val,true); } } float pawsShortcutWindow::GetManaWarnLevel() @@ -1324,7 +1325,7 @@ { if( main_mana ) { - main_mana->SetDanger(val,true,250,0,0); + main_mana->SetDangerLevel(val,true); } } float pawsShortcutWindow::GetManaDangerLevel() @@ -1340,7 +1341,8 @@ { if( main_mana ) { - main_mana->SetFlash(val,true,200,0,0,0); + main_mana->SetFlashLevel(val,true); + main_mana->SetFlashRate(200); } } float pawsShortcutWindow::GetManaFlashLevel() Modified: trunk/src/common/paws/pawsprogressbar.cpp =================================================================== --- trunk/src/common/paws/pawsprogressbar.cpp 2014-08-13 14:56:28 UTC (rev 9541) +++ trunk/src/common/paws/pawsprogressbar.cpp 2014-08-13 15:56:37 UTC (rev 9542) @@ -88,43 +88,56 @@ diff_b = ColourNode2->GetAttributeValueAsInt("b") - start_b; } - csRef<iDocumentNode> ColourNode3 = node->GetNode("flashcolor"); - if(ColourNode3) + csRef<iDocumentNode> OpNode = node->GetNode("flash"); + if(OpNode) { - flash_r = ColourNode3->GetAttributeValueAsInt("r"); - flash_g = ColourNode3->GetAttributeValueAsInt("g"); - flash_b = ColourNode3->GetAttributeValueAsInt("b"); + flashLevel = OpNode->GetAttributeValueAsFloat("level"); + flashLow = OpNode->GetAttributeValueAsBool("low"); + flash_r = OpNode->GetAttributeValueAsInt("r"); + flash_g = OpNode->GetAttributeValueAsInt("g"); + flash_b = OpNode->GetAttributeValueAsInt("b"); + flashRate = OpNode->GetAttributeValueAsInt("rate"); } else { + flashLevel = 0; + flashLow = false; flash_r = 0; flash_g = 0; flash_b = 0; } - csRef<iDocumentNode> ColourNode4 = node->GetNode("warncolor"); - if(ColourNode4) + OpNode = node->GetNode("warn"); + if(OpNode) { - warn_r = ColourNode4->GetAttributeValueAsInt("r"); - warn_g = ColourNode4->GetAttributeValueAsInt("g"); - warn_b = ColourNode4->GetAttributeValueAsInt("b"); + warnLevel = OpNode->GetAttributeValueAsFloat("level"); + warnLow = OpNode->GetAttributeValueAsBool("low"); + warn_r = OpNode->GetAttributeValueAsInt("r"); + warn_g = OpNode->GetAttributeValueAsInt("g"); + warn_b = OpNode->GetAttributeValueAsInt("b"); } else { + warnLevel = 0; + warnLow = false; warn_r = 200; warn_g = 200; warn_b = 0; } - csRef<iDocumentNode> ColourNode5 = node->GetNode("dangercolor"); - if(ColourNode5) + OpNode = node->GetNode("danger"); + if(OpNode) { - danger_r = ColourNode5->GetAttributeValueAsInt("r"); - danger_g = ColourNode5->GetAttributeValueAsInt("g"); - danger_b = ColourNode5->GetAttributeValueAsInt("b"); + dangerLevel = OpNode->GetAttributeValueAsFloat("level"); + dangerLow = OpNode->GetAttributeValueAsBool("low"); + danger_r = OpNode->GetAttributeValueAsInt("r"); + danger_g = OpNode->GetAttributeValueAsInt("g"); + danger_b = OpNode->GetAttributeValueAsInt("b"); } else { + dangerLevel = 0; + dangerLow = false; danger_r = 200; danger_g = 0; danger_b = 0; @@ -260,30 +273,39 @@ start_b = blue; } -void pawsProgressBar::SetFlash(float level, bool low, int rate, int red, int green, int blue ) +void pawsProgressBar::SetReversed( bool val ) { + reversed = val; +} + + +void pawsProgressBar::SetFlashLevel(float level, bool low ) +{ flashLevel = level; flashLow = low; - flashRate = rate; +} +void pawsProgressBar::SetFlashColor( int red, int green, int blue ) +{ flash_r = red; flash_g = green; flash_b = blue; } +void pawsProgressBar::SetFlashRate( int rate) +{ + flashRate = rate; +} float pawsProgressBar::GetFlashLevel() { return flashLevel; } - -void pawsProgressBar::SetReversed( bool val ) +void pawsProgressBar::SetWarningLevel( float level, bool low) { - reversed = val; + warnLevel = level; + warnLow = low; } - -void pawsProgressBar::SetWarning( float level, bool low, int red, int green, int blue ) +void pawsProgressBar::SetWarningColor( int red, int green, int blue ) { - warnLevel = level; - warnLow = low; warn_r = red; warn_g = green; warn_b = blue; @@ -293,10 +315,13 @@ return warnLevel; } -void pawsProgressBar::SetDanger( float level, bool low, int red, int green, int blue ) +void pawsProgressBar::SetDangerLevel( float level, bool low) { dangerLevel = level; dangerLow = low; +} +void pawsProgressBar::SetDangerColor( int red, int green, int blue ) +{ danger_r = red; danger_g = green; danger_b = blue; Modified: trunk/src/common/paws/pawsprogressbar.h =================================================================== --- trunk/src/common/paws/pawsprogressbar.h 2014-08-13 14:56:28 UTC (rev 9541) +++ trunk/src/common/paws/pawsprogressbar.h 2014-08-13 15:56:37 UTC (rev 9542) @@ -48,43 +48,59 @@ */ virtual void SetColor( int red, int green, int blue ); - /** flash a different color if value is below/above threshold. + /** Set threshold for flashing ** numbers outside of min & max = no flash. ** default = no flash. * @param value within this threshold, flash; outside it, no flash. * @param low if TRUE then flash below this level; if FALSE flash above. - * @param rate switch colors every 'rate' ticks + */ + virtual void SetFlashLevel(float level, bool low); + + /** Set flash color * @param red red saturation value * @param green green saturation value * @param blue blue saturation value */ - virtual void SetFlash(float level, bool low, int rate, int red, int green, int blue ); + virtual void SetFlashColor( int red, int green, int blue ); + /** Set rate of flash + * @param rate switch colors every 'rate' ticks + */ + virtual void SetFlashRate( int rate); + /** return the current "flash" level */ float GetFlashLevel(); - /** use a different primary color if above a certain threshold + /** Set threshold for warn color * @param level threshold * @param low if TRUE then active below this level; if FALSE active above. + */ + virtual void SetWarningLevel( float level, bool low); + + /** Set warn color * @param red red saturation value * @param green green saturation value * @param blue blue saturation value */ - virtual void SetWarning( float level, bool low, int red, int green, int blue ); + virtual void SetWarningColor( int red, int green, int blue ); /** return the current "Warn" level */ float GetWarningLevel(); - /** use a different primary color if above a certain threshold + /** set threshold for danger color * @param level threshold * @param low if TRUE then active below this level; if FALSE active above. + */ + virtual void SetDangerLevel( float level, bool low); + + /** Set Danger Color * @param red red saturation value * @param green green saturation value * @param blue blue saturation value */ - virtual void SetDanger( float level, bool low, int red, int green, int blue ); + virtual void SetDangerColor( int red, int green, int blue ); /** return the current "Danger" level */ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2014-08-23 21:52:48
|
Revision: 9547 http://sourceforge.net/p/planeshift/code/9547 Author: joelyon Date: 2014-08-23 21:52:40 +0000 (Sat, 23 Aug 2014) Log Message: ----------- updates to AM & SC config, and warn/danger/flash logic. Modified Paths: -------------- trunk/data/gui/configactivemagic.xml trunk/data/gui/shortcutwindow.xml trunk/src/client/gui/pawsactivemagicwindow.cpp trunk/src/client/gui/pawsconfigactivemagic.cpp trunk/src/client/gui/pawsconfigactivemagic.h trunk/src/client/gui/shortcutwindow.cpp Modified: trunk/data/gui/configactivemagic.xml =================================================================== --- trunk/data/gui/configactivemagic.xml 2014-08-22 14:29:17 UTC (rev 9546) +++ trunk/data/gui/configactivemagic.xml 2014-08-23 21:52:40 UTC (rev 9547) @@ -126,46 +126,46 @@ - <widget name="" factory="pawsTextBox"> - <frame x="15" y="210" width="50" height="20" /> + <widget name="textFontLabel" factory="pawsTextBox"> + <frame x="215" y="210" width="50" height="20" /> <text string="Font"/> </widget> <widget name="textFont" factory="pawsComboBox" id="1015" alwaysontop="true" > - <frame x="60" y="210" width="150" height="20" border="no" /> + <frame x="260" y="210" width="150" height="20" border="no" /> <listbox rows="3" height="20" useScrollBar="true" /> </widget> - <widget name="" factory="pawsTextBox"> - <frame x="15" y="235" width="100" height="20" /> + <widget name="textSizeLabel" factory="pawsTextBox"> + <frame x="215" y="235" width="100" height="20" /> <text string="Text Size"/> </widget> <widget name="textSize" factory="pawsScrollBar" direction="horizontal" style="Standard Scrollbar Horizontal"> - <frame x="100" y="235" width="110" height="20" border="no" /> + <frame x="290" y="235" width="135" height="20" border="no" /> </widget> - <widget name="" factory="pawsTextBox"> - <frame x="15" y="260" width="100" height="20" /> + <widget name="textSpacingLabel" factory="pawsTextBox"> + <frame x="215" y="260" width="100" height="20" /> <text string="Text Spacing"/> </widget> <widget name="textSpacing" factory="pawsScrollBar" direction="horizontal" style="Standard Scrollbar Horizontal"> - <frame x="100" y="260" width="110" height="20" border="no" /> + <frame x="290" y="260" width="135" height="20" border="no" /> </widget> <widget name="useImages" factory="pawsCheckBox" id="1022"> - <frame x="250" y="215" width="190" height="20" /> + <frame x="15" y="215" width="190" height="20" /> <text string="Use Images"/> </widget> <widget name="autoResize" factory="pawsCheckBox" id="1023" > - <frame x="250" y="235" width="190" height="20" /> + <frame x="15" y="235" width="190" height="20" /> <text string="Auto-Resize"/> </widget> <widget name="showWindow" factory="pawsCheckBox" id="1024" > - <frame x="250" y="255" width="190" height="20" /> + <frame x="15" y="255" width="190" height="20" /> <text string="show Active Magic Window"/> </widget> Modified: trunk/data/gui/shortcutwindow.xml =================================================================== --- trunk/data/gui/shortcutwindow.xml 2014-08-22 14:29:17 UTC (rev 9546) +++ trunk/data/gui/shortcutwindow.xml 2014-08-23 21:52:40 UTC (rev 9547) @@ -29,6 +29,9 @@ <widget name="My HP" factory="pawsProgressBar" tooltip="Health"> <frame x="5" y="0" width="250" height="15" border="no" /> + <flash level="0.20" low="true" r="0" g="0" b="0" rate="250" /> + <warn level="0.30" low="true" r="200" g="200" b="0" /> + <danger level="0.10" low="true" r="200" g="0" b="0" /> <attachpoints> <attach point="PROPORTIONAL_RIGHT" /> <attach point="ATTACH_LEFT" /> @@ -54,6 +57,9 @@ </widget> <widget name="My Mana" factory="pawsProgressBar" tooltip="Mana"> <frame x="265" y="0" width="255" height="15" border="no" /> + <flash level="0.20" low="true" r="0" g="0" b="0" rate="250" /> + <warn level="0.30" low="true" r="200" g="200" b="0" /> + <danger level="0.10" low="true" r="200" g="0" b="0" /> <attachpoints> <attach point="ATTACH_RIGHT" /> <attach point="PROPORTIONAL_LEFT" /> Modified: trunk/src/client/gui/pawsactivemagicwindow.cpp =================================================================== --- trunk/src/client/gui/pawsactivemagicwindow.cpp 2014-08-22 14:29:17 UTC (rev 9546) +++ trunk/src/client/gui/pawsactivemagicwindow.cpp 2014-08-23 21:52:40 UTC (rev 9547) @@ -48,6 +48,15 @@ autoResize(true), showEffects(false), show(true), + warnLow(false), + dangerLow(false), + flashLow(false), + warnLevel(0.80), + dangerLevel(0.90), + flashLevel(0.95), + warnMode(0), + dangerMode(0), + flashMode(0), buffList(NULL), lastIndex(0), configPopup(NULL) @@ -662,11 +671,11 @@ { warnLevel=optionNode->GetAttributeValueAsFloat("value", true); } - else - { - Error1("pawsActiveMagicWindow::LoadUserPrefs unable to retrieve warnLevel node"); - warnLevel = 100; - } +// else +// { +// Error1("pawsActiveMagicWindow::LoadUserPrefs unable to retrieve warnLevel node"); +// warnLevel = 100; +// } optionNode = mainNode->GetNode("warnMode"); if(optionNode != NULL) { @@ -679,20 +688,20 @@ warnMode=0; } } - else - { - Error1("pawsActiveMagicWindow::LoadUserPrefs unable to retrieve warnMode node"); - warnMode=0; - } +// else +// { +// Error1("pawsActiveMagicWindow::LoadUserPrefs unable to retrieve warnMode node"); +// warnMode=0; +// } optionNode = mainNode->GetNode("dangerLevel"); if(optionNode != NULL) dangerLevel = optionNode->GetAttributeValueAsFloat("value", true); - else - { - Error1("pawsActiveMagicWindow::LoadUserPrefs unable to retrieve dangerLevel node"); - dangerLevel = 100; - } +// else +// { +// Error1("pawsActiveMagicWindow::LoadUserPrefs unable to retrieve dangerLevel node"); +// dangerLevel = 100; +// } optionNode = mainNode->GetNode("dangerMode"); if(optionNode != NULL) { @@ -705,20 +714,20 @@ dangerMode=0; } } - else - { - Error1("pawsActiveMagicWindow::LoadUserPrefs unable to retrieve dangerMode node"); - dangerMode=0; - } +// else +// { +// Error1("pawsActiveMagicWindow::LoadUserPrefs unable to retrieve dangerMode node"); +// dangerMode=0; +// } optionNode = mainNode->GetNode("flashLevel"); if(optionNode != NULL) flashLevel = optionNode->GetAttributeValueAsFloat("value", true); - else - { - Error1("pawsActiveMagicWindow::LoadUserPrefs unable to retrieve flashLevel node"); - flashLevel=100; - } +// else +// { +// Error1("pawsActiveMagicWindow::LoadUserPrefs unable to retrieve flashLevel node"); +// flashLevel=100; +// } optionNode = mainNode->GetNode("flashMode"); if(optionNode != NULL) { @@ -731,11 +740,11 @@ flashMode=0; } } - else - { - Error1("pawsActiveMagicWindow::LoadUserPrefs unable to retrieve FlashMode node"); - flashMode=0; - } +// else +// { +// Error1("pawsActiveMagicWindow::LoadUserPrefs unable to retrieve FlashMode node"); +// flashMode=0; +// } return true; Modified: trunk/src/client/gui/pawsconfigactivemagic.cpp =================================================================== --- trunk/src/client/gui/pawsconfigactivemagic.cpp 2014-08-22 14:29:17 UTC (rev 9546) +++ trunk/src/client/gui/pawsconfigactivemagic.cpp 2014-08-23 21:52:40 UTC (rev 9547) @@ -218,6 +218,7 @@ } flashMode->SetActive("flashModePercent"); + textFontLabel = (pawsTextBox*)FindWidget("textFontLabel"); textFont = (pawsComboBox*)FindWidget("textFont"); if(!textFont) { @@ -241,6 +242,7 @@ Error1( "pawsConfigActiveMagic::PostSetup unable to find vfs for font list" ); } + textSizeLabel = (pawsTextBox*)FindWidget("textSizeLabel"); textSize = (pawsScrollBar*)FindWidget("textSize"); if(!textSize) { @@ -249,6 +251,7 @@ textSize->SetCurrentValue(10,false); textSize->SetMaxValue(40); + textSpacingLabel = (pawsTextBox*)FindWidget("textSpacingLabel"); textSpacing = (pawsScrollBar*)FindWidget("textSpacing"); if(!textSpacing) { @@ -265,14 +268,20 @@ useImages->SetState( ActiveMagicWindow->GetUseImages() ); if( useImages->GetState()==true ) { + textFontLabel->Hide(); textFont->Hide(); + textSizeLabel->Hide(); textSize->Hide(); + textSpacingLabel->Hide(); textSpacing->Hide(); } else { + textFontLabel->Show(); textFont->Show(); + textSizeLabel->Show(); textSize->Show(); + textSpacingLabel->Show(); textSpacing->Show(); } @@ -403,8 +412,6 @@ xml.AppendFmt("<dangerMode active=\"%s\" />\n", dangerMode->GetActive().GetData()); xml.AppendFmt("<flashLevel value=\"%d\" />\n", int(flashLevel->GetCurrentValue())); xml.AppendFmt("<flashMode active=\"%s\" />\n", flashMode->GetActive().GetData()); -// xml.AppendFmt("<leftScroll active=\"%s\" />\n", leftScroll->GetActive().GetData()); -// xml.AppendFmt("<rightScroll active=\"%s\" />\n", rightScroll->GetActive().GetData()); xml.AppendFmt("<textSize value=\"%d\" />\n", int(textSize->GetCurrentValue())); xml.AppendFmt("<textFont value=\"%s\" />\n", textFont->GetSelectedRowString().GetData()); xml.AppendFmt("<textSpacing value=\"%d\" />\n", int(textSpacing->GetCurrentValue())); @@ -521,14 +528,20 @@ ActiveMagicWindow->SetUseImages(useImages->GetState()); if( useImages->GetState()==true ) { + textFontLabel->Hide(); textFont->Hide(); + textSizeLabel->Hide(); textSize->Hide(); + textSpacingLabel->Hide(); textSpacing->Hide(); } else { + textFontLabel->Show(); textFont->Show(); + textSizeLabel->Show(); textSize->Show(); + textSpacingLabel->Show(); textSpacing->Show(); } if( ActiveMagicWindow->GetAutoResize() ) @@ -729,18 +742,20 @@ csString temp; if( strcmp(warnMode->GetActive(),"warnModePercent")==0 ) { + float tLevel = warnLevel->GetCurrentValue(); + ActiveMagicWindow->SetWarnMode( 0 ); - if( warnLevel->GetCurrentValue()<100 ) + if( tLevel<100 && tLevel>0 ) { - temp.Format("> %2.0f", warnLevel->GetCurrentValue() ); + temp.Format("> %2.0f",tLevel ); warnSetting->SetText( temp ); //if warnlevel is > danger level in % mode, then increase danger level to match. - if( warnLevel->GetCurrentValue()>dangerLevel->GetCurrentValue() ) + if( tLevel>dangerLevel->GetCurrentValue() ) { - dangerLevel->SetCurrentValue( warnLevel->GetCurrentValue() ); + dangerLevel->SetCurrentValue( tLevel ); } - ActiveMagicWindow->SetWarnLevel( warnLevel->GetCurrentValue(), false ); //convert 0-100 int to float for pawsProgressMeter + ActiveMagicWindow->SetWarnLevel( tLevel, false ); //convert 0-100 int to float for pawsProgressMeter } else { @@ -777,18 +792,20 @@ csString temp; if( strcmp(dangerMode->GetActive(),"dangerModePercent")==0 ) { + float tLevel = dangerLevel->GetCurrentValue(); + ActiveMagicWindow->SetDangerMode( 0 ); //if warn level > danger level in percent mode then increase danger level - if( warnLevel->GetCurrentValue()>dangerLevel->GetCurrentValue() ) + if( warnLevel->GetCurrentValue()>tLevel ) { dangerLevel->SetCurrentValue( warnLevel->GetCurrentValue() ); } - if( dangerLevel->GetCurrentValue()<100 ) + if( tLevel<100 && tLevel>0 ) { - temp.Format("> %2.0f", dangerLevel->GetCurrentValue() ); + temp.Format("> %2.0f", tLevel ); dangerSetting->SetText( temp ); - ActiveMagicWindow->SetDangerLevel( dangerLevel->GetCurrentValue(), false ); + ActiveMagicWindow->SetDangerLevel( tLevel, false ); } else { @@ -825,12 +842,14 @@ csString temp; if( strcmp(flashMode->GetActive(),"flashModePercent")==0 ) { + float tLevel = flashLevel->GetCurrentValue(); + ActiveMagicWindow->SetFlashMode( 0 ); - if( flashLevel->GetCurrentValue()<100 ) + if( tLevel<100 && tLevel>0 ) { - temp.Format("> %2.0f", flashLevel->GetCurrentValue() ); + temp.Format("> %2.0f", tLevel ); flashSetting->SetText( temp ); - ActiveMagicWindow->SetFlashLevel( flashLevel->GetCurrentValue(), false ); + ActiveMagicWindow->SetFlashLevel( tLevel, false ); } else { Modified: trunk/src/client/gui/pawsconfigactivemagic.h =================================================================== --- trunk/src/client/gui/pawsconfigactivemagic.h 2014-08-22 14:29:17 UTC (rev 9546) +++ trunk/src/client/gui/pawsconfigactivemagic.h 2014-08-23 21:52:40 UTC (rev 9547) @@ -101,8 +101,11 @@ pawsTextBox* flashSetting; pawsRadioButtonGroup* flashMode; + pawsTextBox* textFontLabel; pawsComboBox* textFont; + pawsTextBox* textSizeLabel; pawsScrollBar* textSize; + pawsTextBox* textSpacingLabel; pawsScrollBar* textSpacing; pawsWidget* ActiveMagic; Modified: trunk/src/client/gui/shortcutwindow.cpp =================================================================== --- trunk/src/client/gui/shortcutwindow.cpp 2014-08-22 14:29:17 UTC (rev 9546) +++ trunk/src/client/gui/shortcutwindow.cpp 2014-08-23 21:52:40 UTC (rev 9547) @@ -70,7 +70,6 @@ position(0), buttonWidth(0), //added 20130726 - ticket 6087 textSpacing(0), -// scrollSize(0), //added 20130726 - ticket 6087 EditMode(0) // 0 = edit lock prevents drag, 1 = edit lock prevent all editing { vfs = csQueryRegistry<iVFS > ( PawsManager::GetSingleton().GetObjectRegistry()); @@ -157,10 +156,6 @@ buttonWidth=subnode->GetValueAsInt(); } } -// else if( strcasecmp( "scrollSize", subnode->GetName() )==0 ) -// { -// scrollSize=subnode->GetValueAsFloat(); -// } else if( strcasecmp( "editMode", subnode->GetName() )==0 ) { if( strcasecmp( "all", subnode->GetValue() )==0 ) @@ -950,7 +945,6 @@ const csString& pawsShortcutWindow::GetCommandName(int shortcutNum ) { if (shortcutNum < 0 || shortcutNum >= NUM_SHORTCUTS) - //if (shortcutNum < 0 ) { static csString error("Out of range"); return error; @@ -1147,62 +1141,32 @@ { SetHPWarnLevel(optionNode->GetAttributeValueAsFloat("value", true)/100); } - else - { - Error1("pawsActiveMagicWindow::LoadUserPrefs unable to retrieve warnLevel node"); - SetHPWarnLevel(0); - } optionNode = mainNode->GetNode("HPDangerLevel"); if(optionNode != NULL) { SetHPDangerLevel(optionNode->GetAttributeValueAsFloat("value", true)/100); } - else - { - Error1("pawsActiveMagicWindow::LoadUserPrefs unable to retrieve warnLevel node"); - SetHPDangerLevel(0); - } optionNode = mainNode->GetNode("HPFlashLevel"); if(optionNode != NULL) { SetHPFlashLevel(optionNode->GetAttributeValueAsFloat("value", true)/100); } - else - { - Error1("pawsActiveMagicWindow::LoadUserPrefs unable to retrieve warnLevel node"); - SetHPFlashLevel(0); - } optionNode = mainNode->GetNode("ManaWarnLevel"); if(optionNode != NULL) { SetManaWarnLevel(optionNode->GetAttributeValueAsFloat("value", true)/100); } - else - { - Error1("pawsActiveMagicWindow::LoadUserPrefs unable to retrieve warnLevel node"); - SetManaWarnLevel(0); - } optionNode = mainNode->GetNode("ManaDangerLevel"); if(optionNode != NULL) { SetManaDangerLevel(optionNode->GetAttributeValueAsFloat("value", true)/100); } - else - { - Error1("pawsActiveMagicWindow::LoadUserPrefs unable to retrieve warnLevel node"); - SetManaDangerLevel(0); - } optionNode = mainNode->GetNode("ManaFlashLevel"); if(optionNode != NULL) { SetManaFlashLevel(optionNode->GetAttributeValueAsFloat("value", true)/100); } - else - { - Error1("pawsActiveMagicWindow::LoadUserPrefs unable to retrieve warnLevel node"); - SetManaFlashLevel(0); - } optionNode = mainNode->GetNode("buttonBackground"); @@ -1242,9 +1206,7 @@ SetFont( fontPath, optionNode->GetAttributeValueAsInt("value", true) ); MenuBar->SetFont( fontPath, optionNode->GetAttributeValueAsInt("value", true) ); } - //else use default. - optionNode = mainNode->GetNode("textSpacing"); if(optionNode != NULL) MenuBar->SetButtonPaddingWidth( optionNode->GetAttributeValueAsInt("value", true)); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2014-09-01 20:34:36
|
Revision: 9552 http://sourceforge.net/p/planeshift/code/9552 Author: joelyon Date: 2014-09-01 20:34:31 +0000 (Mon, 01 Sep 2014) Log Message: ----------- First implementation of renameable containers, currently requires manual db adjustment to sacks as follows : update item_stats set flags='CONTAINER RENAMEABLE' where id=235; Modified Paths: -------------- trunk/data/gui/containerdesc.xml trunk/src/client/cmdusers.cpp trunk/src/client/crashreport.cpp trunk/src/client/gui/pawscontainerdescwindow.cpp trunk/src/client/gui/pawscontainerdescwindow.h trunk/src/common/net/messages.cpp trunk/src/common/net/messages.h trunk/src/server/bulkobjects/psitem.cpp trunk/src/server/bulkobjects/psitemstats.cpp trunk/src/server/bulkobjects/psitemstats.h trunk/src/server/cachemanager.cpp trunk/src/server/usermanager.cpp trunk/src/server/usermanager.h Modified: trunk/data/gui/containerdesc.xml =================================================================== --- trunk/data/gui/containerdesc.xml 2014-08-31 19:42:31 UTC (rev 9551) +++ trunk/data/gui/containerdesc.xml 2014-09-01 20:34:31 UTC (rev 9552) @@ -3,6 +3,23 @@ <widget name="ContainerDescWindow" factory="pawsContainerDescWindow" visible="no" movable="yes" savepositions="yes" style="New Standard GUI"> <frame x="100" y="100" width="300" height="365" border="yes"/> <title resource="Scaling Title Bar" text="Container" align="left" close_button="yes"/> + <!-- Name and name edit widgets --> + <frame x="70" y="10" width="390" height="40" r="40" g="30" b="0" border="yes"/> + <widget name="EditItemName" factory="pawsEditTextBox" > + <frame x="76" y="10" width="150" height="30" border="yes"/> + </widget> + <widget name="ItemName" factory="pawsTextBox"> + <frame x="76" y="10" width="150" height="30" border="yes"/> + </widget> + + <pawsButton name="EnableEditName" id="100" style="Standard Button" visible="yes"> + <frame x="230" y="10" width="60" height="30" /> + <label text="Rename"/> + </pawsButton> + <pawsButton name="SendEditName" id="110" style="Standard Button" visible="yes"> + <frame x="230" y="10" width="60" height="30" /> + <label text="Save"/> + </pawsButton> <widget name="UseContainer" factory="pawsButton" id="12" tooltip="Use the container"> <frame x="10" y="70" width="48" height="48" /> @@ -37,11 +54,8 @@ <widget name="ItemImage" factory="pawsWidget" visible="yes" > <frame x="10" y="35" width="48" height="48" border="no"/> </widget> - <widget name="ItemName" factory="pawsTextBox" > - <frame x="10" y="5" width="270" height="20"/> - </widget> <widget name="ItemDescription" factory="pawsMultiLineTextBox" > - <frame x="80" y="27" width="210" height="120" border="no"/> + <frame x="80" y="45" width="210" height="100" border="no"/> </widget> Modified: trunk/src/client/cmdusers.cpp =================================================================== --- trunk/src/client/cmdusers.cpp 2014-08-31 19:42:31 UTC (rev 9551) +++ trunk/src/client/cmdusers.cpp 2014-09-01 20:34:31 UTC (rev 9552) @@ -110,6 +110,7 @@ cmdsource->Subscribe("/pickup", this); cmdsource->Subscribe("/pos", this); //cmdsource->Subscribe("/quests", this); + cmdsource->Subscribe("/rename", this); cmdsource->Subscribe("/repair", this); cmdsource->Subscribe("/roll", this); cmdsource->Subscribe("/rotate", this); @@ -144,6 +145,8 @@ cmdsource->Subscribe("/loadshortcuts", this); // load shortcuts bar from a named file cmdsource->Subscribe("/saveshortcuts", this); // load shortcuts bar from a named file cmdsource->Subscribe("/togglerun", this); // Change the run/walk status of the character + + cmdsource->Subscribe("/rename", this); // Rename an item } psUserCommands::~psUserCommands() @@ -193,6 +196,8 @@ cmdsource->Unsubscribe("/pickup", this); cmdsource->Unsubscribe("/pos", this); //cmdsource->Unsubscribe("/quests", this); + cmdsource->Unsubscribe("/rename", + this); cmdsource->Unsubscribe("/repair", this); cmdsource->Unsubscribe("/roll", this); cmdsource->Unsubscribe("/rotate", this); @@ -228,6 +233,7 @@ cmdsource->Unsubscribe("/saveshortcuts", this); cmdsource->Unsubscribe("/togglerun", this); + cmdsource->Unsubscribe("/rename", this); // Rename an item // Unsubscribe emotes. for(unsigned int i=0; i < emoteList.GetSize(); i++) @@ -1343,6 +1349,41 @@ } return "Usage: /togglerun [run|walk]"; } + else if (words[0] == "/rename") + { + csString targetString; + if (words[1].IsEmpty()) + { + targetString = FormatTarget(); + } + else + { + if(words[1].StartsWith("cid:")){ + targetString.Append(words[1]); + }else{ + targetString = FormatTarget(words[1]); + } + } + if(!words[2].IsEmpty()){ + // hard coded check of the length of the new string + if(words[2].Length()>50){ + return "New name is too long" ; + } + targetString.Append(" "); + targetString.Append(words[2]); + } + if (!targetString.IsEmpty()) + { + csString newCmd; + newCmd.Append("/rename "); + newCmd.Append(targetString); + Debug3(LOG_NET, 0, "rename string: %s %s", newCmd.GetDataSafe(),words[1].GetDataSafe()); + psUserCmdMessage cmdmsg(newCmd); + cmdmsg.SendMessage(); + }else{ + return "Usage /rename [item] [name] "; + } + } else { psUserCmdMessage cmdmsg(cmd); Modified: trunk/src/client/crashreport.cpp =================================================================== --- trunk/src/client/crashreport.cpp 2014-08-31 19:42:31 UTC (rev 9551) +++ trunk/src/client/crashreport.cpp 2014-09-01 20:34:31 UTC (rev 9552) @@ -28,10 +28,7 @@ #undef USE_BREAKPAD #endif -// Force breakpad usage -#define USE_BREAKPAD - #ifdef USE_BREAKPAD #ifdef WIN32 #include "resource.h" Modified: trunk/src/client/gui/pawscontainerdescwindow.cpp =================================================================== --- trunk/src/client/gui/pawscontainerdescwindow.cpp 2014-08-31 19:42:31 UTC (rev 9551) +++ trunk/src/client/gui/pawscontainerdescwindow.cpp 2014-09-01 20:34:31 UTC (rev 9552) @@ -74,7 +74,9 @@ name = (pawsTextBox*)FindWidget("ItemName"); if (!name) return false; - + editName = (pawsEditTextBox*)FindWidget("EditItemName"); + if (!editName) + return false; description = dynamic_cast<pawsMultiLineTextBox*> (FindWidget("ItemDescription")); if (!description) return false; @@ -122,8 +124,24 @@ Show(); psViewContainerDescription mesg(me, psengine->GetNetManager()->GetConnection()->GetAccessPointers()); + // check whether the renameable flag is set, if so, show the rename button + if(mesg.renameable==true){ + FindWidget("EnableEditName")->Show(); + }else{ + FindWidget("EnableEditName")->Hide(); + FindWidget("SendEditName")->Hide(); + } + + // default display configuration for container + editName->Hide(); + name->Show(); + description->SetText( mesg.itemDescription ); name->SetText( mesg.itemName ); + + editName->SetText( mesg.itemName ); + editName->SetMaxLength( 50 ); + pic->Show(); pic->SetBackground(mesg.itemIcon); if (pic->GetBackground() != mesg.itemIcon) // if setting the background failed...hide it @@ -228,8 +246,31 @@ { csString widgetName(widget->GetName()); - if ( widgetName == "SmallInvButton" ) + if ( widgetName == "SendEditName" ) + { + csString command; + command.Format("/rename cid:%u %s",containerID, editName->GetText()); + psengine->GetCmdHandler()->Execute(command.GetData()); + + // Update the labels, hide the editable one and swap buttons + widget->Hide(); + FindWidget("EnableEditName")->Show(); + name->SetText(editName->GetText()); + editName->Hide(); + name->Show(); + } + + // this toggles the rename edit button + else if ( widgetName == "EnableEditName" ) { + widget->Hide(); + FindWidget("SendEditName")->Show(); + name->Hide(); + editName->Show(); + } + + else if ( widgetName == "SmallInvButton" ) + { pawsWidget* widget = PawsManager::GetSingleton().FindWidget("SmallInventoryWindow"); if ( widget ) widget->Show(); Modified: trunk/src/client/gui/pawscontainerdescwindow.h =================================================================== --- trunk/src/client/gui/pawscontainerdescwindow.h 2014-08-31 19:42:31 UTC (rev 9551) +++ trunk/src/client/gui/pawscontainerdescwindow.h 2014-09-01 20:34:31 UTC (rev 9552) @@ -53,6 +53,7 @@ void HandleUpdateItem( MsgEntry* me ); void HandleViewContainer( MsgEntry* me ); + pawsEditTextBox* editName; pawsTextBox* name; pawsMultiLineTextBox* description; pawsWidget* pic; Modified: trunk/src/common/net/messages.cpp =================================================================== --- trunk/src/common/net/messages.cpp 2014-08-31 19:42:31 UTC (rev 9551) +++ trunk/src/common/net/messages.cpp 2014-09-01 20:34:31 UTC (rev 9552) @@ -1535,6 +1535,13 @@ } return; } + if(command == "/rename") + { + target = words.Get(1); + action = words.Get(2); + text = words.Get(3); + return; + } valid = false; } @@ -6160,7 +6167,18 @@ this->itemDescription = description; this->itemIcon = icon; this->to = to; - msgSize = (int)(sizeof(uint8_t) + sizeof(bool) + name.Length() + desc.Length() + iconName.Length() + 3 + sizeof(int32_t) + sizeof(int32_t) + sizeof(uint32_t)); + + msgSize = (int) //cast to int, prettu straight forward, be sure to be following me + (sizeof(uint8_t) + // add the destination client id + sizeof(bool) + // bool for hasContents + name.Length() + // size of the name string + desc.Length() + // size of the description + iconName.Length() + // the name of the icon to load + 3 + // Magic numbers, you gotta love 'em + sizeof(int32_t) + // container ID + sizeof(int32_t) + // slot id + sizeof(uint32_t) + // stack count + sizeof(bool)); // is renameable } void psViewContainerDescription::AddContents(const char* name, const char* meshName, const char* materialName, const char* icon, int purifyStatus, int slot, int stack) @@ -6204,6 +6222,7 @@ msg->Add((uint32_t)contents[n].slotID); msg->Add((uint32_t)contents[n].stackCount); } + msg->Add(renameable); } psViewContainerDescription::psViewContainerDescription(MsgEntry* me, NetBase::AccessPointers* accessPointers) @@ -6250,6 +6269,7 @@ contents.Push(item); } } + renameable = me->GetBool(); } } Modified: trunk/src/common/net/messages.h =================================================================== --- trunk/src/common/net/messages.h 2014-08-31 19:42:31 UTC (rev 9551) +++ trunk/src/common/net/messages.h 2014-09-01 20:34:31 UTC (rev 9552) @@ -4396,6 +4396,9 @@ /// True if this item is a container and has contents. bool hasContents; + /// indicates whether the container is renameable or not + bool renameable; + /// The destination client for this message. int to; Modified: trunk/src/server/bulkobjects/psitem.cpp =================================================================== --- trunk/src/server/bulkobjects/psitem.cpp 2014-08-31 19:42:31 UTC (rev 9551) +++ trunk/src/server/bulkobjects/psitem.cpp 2014-09-01 20:34:31 UTC (rev 9552) @@ -3273,7 +3273,7 @@ outgoing.containerID = containerID; outgoing.maxContainerSlots = GetContainerMaxSlots(); - + outgoing.renameable = GetBaseStats()->GetIsRenameable(); FillContainerMsg(client, outgoing); outgoing.ConstructMsg(psserver->GetCacheManager()->GetMsgStrings()); Modified: trunk/src/server/bulkobjects/psitemstats.cpp =================================================================== --- trunk/src/server/bulkobjects/psitemstats.cpp 2014-08-31 19:42:31 UTC (rev 9551) +++ trunk/src/server/bulkobjects/psitemstats.cpp 2014-09-01 20:34:31 UTC (rev 9552) @@ -1188,6 +1188,10 @@ { return (flags & PSITEMSTATS_FLAG_IS_GLYPH) ? true : false; } +bool psItemStats::GetIsRenameable() +{ + return (flags & PSITEMSTATS_FLAG_IS_RENAMEABLE) ? true : false; +} uint32 psItemStats::GetUID() { @@ -1259,6 +1263,9 @@ TempString.Append("BUY_PERSONALISE "); if(flags & PSITEMSTATS_FLAG_IS_RECHARGEABLE) TempString.Append("RECHARGEABLE "); + if(flags & PSITEMSTATS_FLAG_IS_RENAMEABLE) + TempString.Append("RENAMEABLE ") + return(TempString); } Modified: trunk/src/server/bulkobjects/psitemstats.h =================================================================== --- trunk/src/server/bulkobjects/psitemstats.h 2014-08-31 19:42:31 UTC (rev 9551) +++ trunk/src/server/bulkobjects/psitemstats.h 2014-09-01 20:34:31 UTC (rev 9552) @@ -183,6 +183,7 @@ #define PSITEMSTATS_FLAG_IS_RECHARGEABLE 0x00400000 #define PSITEMSTATS_FLAG_IS_A_TRAP 0x00800000 #define PSITEMSTATS_FLAG_IS_CONSTRUCTIBLE 0x01000000 +#define PSITEMSTATS_FLAG_IS_RENAMEABLE 0x02000000 #define CREATIVEDEF_MAX 65535 // Max length for 'text' field in MySQL db. @@ -648,6 +649,7 @@ bool GetIsStackable(); bool GetIsEquipStackable(); bool GetIsGlyph(); + bool GetIsRenameable(); bool GetIsConsumable(); bool GetIsReadable(); bool GetIsWriteable(); Modified: trunk/src/server/cachemanager.cpp =================================================================== --- trunk/src/server/cachemanager.cpp 2014-08-31 19:42:31 UTC (rev 9551) +++ trunk/src/server/cachemanager.cpp 2014-09-01 20:34:31 UTC (rev 9552) @@ -127,7 +127,11 @@ ItemStatFlagArray.Push(statflag); statflag.Set("BUY_PERSONALISE",PSITEMSTATS_FLAG_BUY_PERSONALISE); ItemStatFlagArray.Push(statflag); + //Added itemStatFlagEntry to the ItemStatFlagArray + statflag.Set("RENAMEABLE", PSITEMSTATS_FLAG_IS_RENAMEABLE); + ItemStatFlagArray.Push(statflag); + // Flag that allows an item to be stacked if qualities are different // and the resulting stack will have the new average. statflag.Set("AVERAGEQUALITY", PSITEMSTATS_FLAG_AVERAGEQUALITY); Modified: trunk/src/server/usermanager.cpp =================================================================== --- trunk/src/server/usermanager.cpp 2014-08-31 19:42:31 UTC (rev 9551) +++ trunk/src/server/usermanager.cpp 2014-09-01 20:34:31 UTC (rev 9552) @@ -198,6 +198,7 @@ userCommandHash.Put("/yield", &UserManager::HandleYield); userCommandHash.Put("/takeall", &UserManager::HandleTakeAll); // Handle trying to take all items from container userCommandHash.Put("/takestackall", &UserManager::HandleTakeStackAll); // Take all items from container and stack them not precisely + userCommandHash.Put("/rename" , &UserManager::HandleRename); } UserManager::~UserManager() @@ -2832,6 +2833,72 @@ psserver->GetCombatManager()->StopAttack(targeter->GetActor()); } +// this function is in charge of preparsing the message and sending it to +// the Rename function +void UserManager::HandleRename(psUserCmdMessage &msg, Client *client){ + + // we hold a reference to the item to rename,. + psItem *item; + INVENTORY_SLOT_NUMBER number; + + // this is usually the case in which the user renames through the + // container description window, in such case, we have to point to the + // inventory and get the psItem out of it (using the containerID); + if (msg.target.StartsWith("cid:")) + { + number = (INVENTORY_SLOT_NUMBER)atoi(msg.target.Slice(4).GetData()); + item = client->GetActor()->GetCharacterData()->Inventory().GetItem(NULL,number); + + Debug3(LOG_NET,0,"renaming...%s->%s",item->ToString(),msg.action.GetData()); + Rename(client,&msg.action,item); + } + + // We could also get the psItem using the EID, the method supports it. + // TODO: consider this +} + + +// This function is in charge of doing the actual renaming, it does check +// the flags, the bad words, etc. +void UserManager::Rename(Client *client, csString *target, psItem *item){ + + // if the string length exceeds 50, send an error message + // TODO: we need a macro for this guys + if(target->Length() > 50){ + psserver->SendSystemError(client->GetClientNum(), "New name is too long"); + } + + // Should check if it we are pointing somewhere safe... + if(!item) + { + psserver->SendSystemError(client->GetClientNum(), + "The item does not exist"); + return; + } + + // check if it is renameable + if(!item->GetBaseStats()->GetIsRenameable()) + { + psserver->SendSystemError(client->GetClientNum(), + " You cannot rename this item"); + return; + } + + // TODO: check if the name is a valid name for the item, I do not have a valid + // database to test this... + + // set the name + item->SetName(target->GetData()); + + // save the item + item->Save(false); + + // notify the user that everything went fine + psserver->SendSystemOK(client->GetClientNum(), + " The item was successfully renamed"); +} + + /*---------------------------------------------------------------------*/ psUserStatRegeneration::psUserStatRegeneration(UserManager* mgr, csTicks ticks) Modified: trunk/src/server/usermanager.h =================================================================== --- trunk/src/server/usermanager.h 2014-08-31 19:42:31 UTC (rev 9551) +++ trunk/src/server/usermanager.h 2014-09-01 20:34:31 UTC (rev 9552) @@ -622,8 +622,10 @@ * */ void SwitchAttackTarget(Client* targeter, Client* targeted); + void HandleRename(psUserCmdMessage &msg, Client* client); + + void Rename(Client *client, csString *target, psItem *item); - /// Struct to hold our emote data. struct EMOTE { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2014-09-20 17:49:14
|
Revision: 9571 http://sourceforge.net/p/planeshift/code/9571 Author: joelyon Date: 2014-09-20 17:49:11 +0000 (Sat, 20 Sep 2014) Log Message: ----------- broke HP & Mana warn/danger/flash settings out of configshortcut and added new config interface that applies to HP and Mana in both shortcut bar and info window. Modified Paths: -------------- trunk/data/gui/configshortcut.xml trunk/data/gui/configwindow.xml trunk/src/client/gui/pawsconfigshortcut.cpp trunk/src/client/gui/pawsinfowindow.cpp trunk/src/client/gui/pawsinfowindow.h trunk/src/client/gui/shortcutwindow.cpp trunk/src/client/gui/shortcutwindow.h trunk/src/client/psengine.cpp trunk/src/common/paws/pawsprogressbar.cpp trunk/src/common/paws/pawsprogressbar.h Added Paths: ----------- trunk/src/client/gui/pawsconfigHPandMana.cpp trunk/src/client/gui/pawsconfigHPandMana.h Modified: trunk/data/gui/configshortcut.xml =================================================================== --- trunk/data/gui/configshortcut.xml 2014-09-16 23:33:20 UTC (rev 9570) +++ trunk/data/gui/configshortcut.xml 2014-09-20 17:49:11 UTC (rev 9571) @@ -158,71 +158,6 @@ <frame x="250" y="85" width="160" height="20" /> <text string="Health and Mana" /> </widget> - - - - <widget name="" factory="pawsTextBox"> - <frame x="265" y="110" width="100" height="20" /> - <text string="Health Meter"/> - </widget> - - <widget name="" factory="pawsTextBox"> - <frame x="250" y="135" width="100" height="20" /> - <text string="Warn"/> - </widget> - <widget name="HPWarnLevel" factory="pawsScrollBar" direction="horizontal" style="Standard Scrollbar Horizontal"> - <frame x="300" y="135" width="120" height="20" border="no" /> - </widget> - - <widget name="" factory="pawsTextBox"> - <frame x="250" y="160" width="100" height="20" /> - <text string="Danger"/> - </widget> - <widget name="HPDangerLevel" factory="pawsScrollBar" direction="horizontal" style="Standard Scrollbar Horizontal"> - <frame x="300" y="160" width="120" height="20" border="no" /> - </widget> - - <widget name="" factory="pawsTextBox"> - <frame x="250" y="185" width="100" height="20" /> - <text string="Flash"/> - </widget> - <widget name="HPFlashLevel" factory="pawsScrollBar" direction="horizontal" style="Standard Scrollbar Horizontal"> - <frame x="300" y="185" width="120" height="20" border="no" /> - </widget> - - - - - <widget name="" factory="pawsTextBox"> - <frame x="265" y="210" width="100" height="20" /> - <text string="Mana Meter"/> - </widget> - - <widget name="" factory="pawsTextBox"> - <frame x="250" y="235" width="100" height="20" /> - <text string="Warn"/> - </widget> - <widget name="ManaWarnLevel" factory="pawsScrollBar" direction="horizontal" style="Standard Scrollbar Horizontal"> - <frame x="300" y="235" width="120" height="20" border="no" /> - </widget> - - <widget name="" factory="pawsTextBox"> - <frame x="250" y="260" width="100" height="20" /> - <text string="Danger"/> - </widget> - <widget name="ManaDangerLevel" factory="pawsScrollBar" direction="horizontal" style="Standard Scrollbar Horizontal"> - <frame x="300" y="260" width="120" height="20" border="no" /> - </widget> - - <widget name="" factory="pawsTextBox"> - <frame x="250" y="285" width="100" height="20" /> - <text string="Flash"/> - </widget> - <widget name="ManaFlashLevel" factory="pawsScrollBar" direction="horizontal" style="Standard Scrollbar Horizontal"> - <frame x="300" y="285" width="120" height="20" border="no" /> - </widget> - - </widget> </widget_description> Modified: trunk/data/gui/configwindow.xml =================================================================== --- trunk/data/gui/configwindow.xml 2014-09-16 23:33:20 UTC (rev 9570) +++ trunk/data/gui/configwindow.xml 2014-09-20 17:49:11 UTC (rev 9571) @@ -115,6 +115,10 @@ <attr name="SectionName" value="activemagic"/> <attr name="factory" value="pawsConfigActiveMagic"/> </widget> + <widget factory="pawsSimpleTreeNode" label="HP and Mana Bars"> + <attr name="SectionName" value="HPandMana"/> + <attr name="factory" value="pawsConfigHPandMana"/> + </widget> </widget> <widget factory="pawsSimpleTreeNode" label="Confirmations"> Added: trunk/src/client/gui/pawsconfigHPandMana.cpp =================================================================== --- trunk/src/client/gui/pawsconfigHPandMana.cpp (rev 0) +++ trunk/src/client/gui/pawsconfigHPandMana.cpp 2014-09-20 17:49:11 UTC (rev 9571) @@ -0,0 +1,524 @@ +/* + * pawsconfighpandmana.cpp - Author: Joe Lyon + * + * Copyright (C) 2013 Atomic Blue (in...@pl..., http://www.atomicblue.org) + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation (version 2 of the License) + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +// CS INCLUDES +#include <psconfig.h> +#include <csutil/xmltiny.h> +#include <csutil/objreg.h> +#include <iutil/stringarray.h> +#include <iutil/vfs.h> + + +// COMMON INCLUDES +#include "util/log.h" +#include "psmainwidget.h" + +// CLIENT INCLUDES +#include "../globals.h" +#include "util/psxmlparser.h" + + +// PAWS INCLUDES +#include "pawsconfigHPandMana.h" +#include "paws/pawsmanager.h" +#include "paws/pawscheckbox.h" +#include "shortcutwindow.h" +#include "pawsinfowindow.h" +#include "pawsscrollmenu.h" +#include "paws/pawsradio.h" + +pawsConfigHPandMana::pawsConfigHPandMana() : + ShortcutMenu(NULL), + MenuBar(NULL), + InfoWindow(NULL), + HPWarnLevel(NULL), + HPWarnSetting(NULL), + HPDangerLevel(NULL), + HPDangerSetting(NULL), + HPFlashLevel(NULL), + HPFlashSetting(NULL), + ManaWarnLevel(NULL), + ManaWarnSetting(NULL), + ManaDangerLevel(NULL), + ManaDangerSetting(NULL), + ManaFlashLevel(NULL), + ManaFlashSetting(NULL) +{ + loaded= false; +} + +bool pawsConfigHPandMana::Initialize() +{ + LoadFromFile("confighpandmana.xml"); + return true; +} + +bool pawsConfigHPandMana::PostSetup() +{ +//get pointers to Shortcut Menu and its Menu Bar + psMainWidget* Main = psengine->GetMainWidget(); + if( Main==NULL ) + { + Error1( "pawsConfigHPandMana::PostSetup unable to get psMainWidget\n"); + return false; + } + + ShortcutMenu = Main->FindWidget( "ShortcutMenu",true ); + if( ShortcutMenu==NULL ) + { + Error1( "pawsConfigHPandMana::PostSetup unable to get ShortcutMenu\n"); + return false; + } + + MenuBar = (pawsScrollMenu*)(ShortcutMenu->FindWidget( "MenuBar",true )); + if( MenuBar==NULL ) + { + Error1( "pawsConfigHPandMana::PostSetup unable to get MenuBar\n"); + return false; + } + +//get pointer to Info window + InfoWindow = (pawsInfoWindow *)Main->FindWidget( "InfoWindow", true ); + if( InfoWindow==NULL ) + { + Error1( "pawsConfigHPandMana::PostSetup unable to get InfoWindow\n"); + return false; + } + + +//get form widgets + + HPWarnLevel = (pawsScrollBar*)FindWidget("HPWarnLevel"); + if(!HPWarnLevel) + { + return false; + } + HPWarnLevel->EnableValueLimit(true); + HPWarnLevel->SetMinValue(0); + HPWarnLevel->SetMaxValue(100); + HPWarnLevel->SetCurrentValue(0,false); + + HPWarnSetting = (pawsTextBox*)FindWidget("HPWarnSetting"); + if(!HPWarnSetting) + { + return false; + } + + + HPDangerLevel = (pawsScrollBar*)FindWidget("HPDangerLevel"); + if(!HPDangerLevel) + { + return false; + } + HPDangerLevel->EnableValueLimit(true); + HPDangerLevel->SetMinValue(0); + HPDangerLevel->SetMaxValue(100); + HPDangerLevel->SetCurrentValue(0,false); + + HPDangerSetting = (pawsTextBox*)FindWidget("HPDangerSetting"); + if(!HPDangerSetting) + { + return false; + } + + + HPFlashLevel = (pawsScrollBar*)FindWidget("HPFlashLevel"); + if(!HPFlashLevel) + { + return false; + } + HPFlashLevel->EnableValueLimit(true); + HPFlashLevel->SetMinValue(0); + HPFlashLevel->SetMaxValue(100); + HPFlashLevel->SetCurrentValue(0,false); + + HPFlashSetting = (pawsTextBox*)FindWidget("HPFlashSetting"); + if(!HPFlashSetting) + { + return false; + } + + + ManaWarnLevel = (pawsScrollBar*)FindWidget("ManaWarnLevel"); + if(!ManaWarnLevel) + { + return false; + } + ManaWarnLevel->EnableValueLimit(true); + ManaWarnLevel->SetMinValue(0); + ManaWarnLevel->SetMaxValue(100); + ManaWarnLevel->SetCurrentValue(0,false); + + ManaWarnSetting = (pawsTextBox*)FindWidget("ManaWarnSetting"); + if(!ManaWarnSetting) + { + return false; + } + + + ManaDangerLevel = (pawsScrollBar*)FindWidget("ManaDangerLevel"); + if(!ManaDangerLevel) + { + return false; + } + ManaDangerLevel->EnableValueLimit(true); + ManaDangerLevel->SetMinValue(0); + ManaDangerLevel->SetMaxValue(100); + ManaDangerLevel->SetCurrentValue(0,false); + + ManaDangerSetting = (pawsTextBox*)FindWidget("ManaDangerSetting"); + if(!ManaDangerSetting) + { + return false; + } + + + ManaFlashLevel = (pawsScrollBar*)FindWidget("ManaFlashLevel"); + if(!ManaFlashLevel) + { + return false; + } + ManaFlashLevel->EnableValueLimit(true); + ManaFlashLevel->SetMinValue(0); + ManaFlashLevel->SetMaxValue(100); + ManaFlashLevel->SetCurrentValue(0,false); + + ManaFlashSetting = (pawsTextBox*)FindWidget("ManaFlashSetting"); + if(!ManaFlashSetting) + { + return false; + } + + loaded=true; + return true; +} + +bool pawsConfigHPandMana::LoadConfig() +{ + + HPWarnLevel->SetCurrentValue( ((pawsShortcutWindow*)ShortcutMenu)->GetHPWarnLevel() ); + UpdateHPWarnLevel(); + + HPDangerLevel->SetCurrentValue( ((pawsShortcutWindow*)ShortcutMenu)->GetHPDangerLevel() ); + UpdateHPDangerLevel(); + + HPFlashLevel->SetCurrentValue( ((pawsShortcutWindow*)ShortcutMenu)->GetHPFlashLevel() ); + UpdateHPFlashLevel(); + + ManaWarnLevel->SetCurrentValue( ((pawsShortcutWindow*)ShortcutMenu)->GetManaWarnLevel() ); + UpdateManaWarnLevel(); + + ManaDangerLevel->SetCurrentValue( ((pawsShortcutWindow*)ShortcutMenu)->GetManaDangerLevel() ); + UpdateManaDangerLevel(); + + ManaFlashLevel->SetCurrentValue( ((pawsShortcutWindow*)ShortcutMenu)->GetManaFlashLevel() ); + UpdateManaFlashLevel(); + + + loaded= true; + dirty = false; + return true; +} + +bool pawsConfigHPandMana::SaveConfig() +{ + + csString xml; + xml = "<hpandmana>\n"; + xml.AppendFmt("<HPWarnLevel value=\"%d\" />\n", + int(HPWarnLevel->GetCurrentValue())); + xml.AppendFmt("<HPDangerLevel value=\"%d\" />\n", + int(HPDangerLevel->GetCurrentValue())); + xml.AppendFmt("<HPFlashLevel value=\"%d\" />\n", + int(HPFlashLevel->GetCurrentValue())); + xml.AppendFmt("<ManaWarnLevel value=\"%d\" />\n", + int(ManaWarnLevel->GetCurrentValue())); + xml.AppendFmt("<ManaDangerLevel value=\"%d\" />\n", + int(ManaDangerLevel->GetCurrentValue())); + xml.AppendFmt("<ManaFlashLevel value=\"%d\" />\n", + int(ManaFlashLevel->GetCurrentValue())); + xml += "</hpandmana>\n"; + + dirty = false; + + return psengine->GetVFS()->WriteFile("/planeshift/userdata/options/confighpandmana.xml", + xml,xml.Length()); +} + +void pawsConfigHPandMana::UpdateHPWarnLevel( ) +{ + if( !loaded ) return; + csString temp; + float tLevel = HPWarnLevel->GetCurrentValue(); + + if( tLevel<100 && tLevel>=1.0 ) + { + temp.Format("> %2.0f%%",tLevel ); + HPWarnSetting->SetText( temp ); + + //if warnlevel is > danger level in % mode, then increase danger level to match. + if( tLevel>HPDangerLevel->GetCurrentValue() ) + { + ((pawsShortcutWindow*)(ShortcutMenu))->SetHPDangerLevel( HPDangerLevel->GetCurrentValue()/100 ); + } + ((pawsShortcutWindow*)(ShortcutMenu))->SetHPWarnLevel( tLevel/100 ); //convert 0-100 int to float for pawsProgressMeter + InfoWindow->SetHPWarnLevel( tLevel/100 ); //convert 0-100 int to float for pawsProgressMeter + } + else + { + HPWarnSetting->SetText( "Disabled" ); + ((pawsShortcutWindow*)(ShortcutMenu))->SetHPWarnLevel( 0 ); + InfoWindow->SetHPWarnLevel( 0 ); + } +} + +void pawsConfigHPandMana::UpdateHPDangerLevel( ) +{ + if( !loaded ) return; + csString temp; + float tLevel = HPDangerLevel->GetCurrentValue(); + + if( tLevel<100 && tLevel>=1.0 ) + { + temp.Format("> %2.0f%%",tLevel ); + HPDangerSetting->SetText( temp ); + + //if warnlevel is > danger level in % mode, then increase danger level to match. + if( HPWarnLevel->GetCurrentValue()>tLevel ) + { + tLevel=HPWarnLevel->GetCurrentValue(); + } + ((pawsShortcutWindow*)(ShortcutMenu))->SetHPDangerLevel( tLevel/100 ); //convert 0-100 int to float for pawsProgressMeter + InfoWindow->SetHPDangerLevel( tLevel/100 ); //convert 0-100 int to float for pawsProgressMeter + } + else + { + HPDangerSetting->SetText( "Disabled" ); + ((pawsShortcutWindow*)(ShortcutMenu))->SetHPDangerLevel( 0 ); + InfoWindow->SetHPDangerLevel( 0 ); + } +} + +void pawsConfigHPandMana::UpdateHPFlashLevel( ) +{ + if( !loaded ) return; + csString temp; + float tLevel = HPFlashLevel->GetCurrentValue(); + + if( tLevel<100 && tLevel>=1.0 ) + { + temp.Format("> %2.0f%%",tLevel ); + HPFlashSetting->SetText( temp ); + ((pawsShortcutWindow*)(ShortcutMenu))->SetHPFlashLevel( tLevel/100 ); //convert 0-100 int to float for pawsProgressMeter + InfoWindow->SetHPFlashLevel( tLevel/100 ); //convert 0-100 int to float for pawsProgressMeter + } + else + { + HPFlashSetting->SetText( "Disabled" ); + ((pawsShortcutWindow*)(ShortcutMenu))->SetHPFlashLevel( 0 ); + ((pawsShortcutWindow*)(ShortcutMenu))->SetHPOn( true ); + InfoWindow->SetHPFlashLevel( 0 ); + } +} + +void pawsConfigHPandMana::UpdateManaWarnLevel( ) +{ + if( !loaded ) return; + csString temp; + float tLevel = ManaWarnLevel->GetCurrentValue(); + + if( tLevel<100 && tLevel>=1.0 ) + { + temp.Format("> %2.0f%%",tLevel ); + ManaWarnSetting->SetText( temp ); + + //if warnlevel is > danger level in % mode, then increase danger level to match. + if( tLevel>ManaDangerLevel->GetCurrentValue() ) + { + ((pawsShortcutWindow*)(ShortcutMenu))->SetManaDangerLevel( ManaDangerLevel->GetCurrentValue()/100 ); + } + ((pawsShortcutWindow*)(ShortcutMenu))->SetManaWarnLevel( tLevel/100 ); //convert 0-100 int to float for pawsProgressMeter + InfoWindow->SetManaWarnLevel( tLevel/100 ); //convert 0-100 int to float for pawsProgressMeter + } + else + { + ManaWarnSetting->SetText( "Disabled" ); + ((pawsShortcutWindow*)(ShortcutMenu))->SetManaWarnLevel( 0 ); + InfoWindow->SetManaWarnLevel( 0 ); + } +} + +void pawsConfigHPandMana::UpdateManaDangerLevel( ) +{ + if( !loaded ) return; + csString temp; + float tLevel = ManaDangerLevel->GetCurrentValue(); + + if( tLevel<100 && tLevel>=1.0 ) + { + temp.Format("> %2.0f%%",tLevel ); + ManaDangerSetting->SetText( temp ); + + //if warnlevel is > danger level in % mode, then increase danger level to match. + if( ManaWarnLevel->GetCurrentValue()>tLevel ) + { + tLevel=ManaWarnLevel->GetCurrentValue(); + } + ((pawsShortcutWindow*)(ShortcutMenu))->SetManaDangerLevel( tLevel/100 ); //convert 0-100 int to float for pawsProgressMeter + InfoWindow->SetManaDangerLevel( tLevel/100 ); //convert 0-100 int to float for pawsProgressMeter + } + else + { + ManaDangerSetting->SetText( "Disabled" ); + ((pawsShortcutWindow*)(ShortcutMenu))->SetManaDangerLevel( 0 ); + InfoWindow->SetManaDangerLevel( 0 ); + } +} + +void pawsConfigHPandMana::UpdateManaFlashLevel( ) +{ + if( !loaded ) return; + csString temp; + float tLevel = ManaFlashLevel->GetCurrentValue(); + + if( tLevel<100 && tLevel>=1.0 ) + { + temp.Format("> %2.0f%%",tLevel ); + ManaFlashSetting->SetText( temp ); + ((pawsShortcutWindow*)(ShortcutMenu))->SetManaFlashLevel( tLevel/100 ); //convert 0-100 int to float for pawsProgressMeter + InfoWindow->SetManaFlashLevel( tLevel/100 ); //convert 0-100 int to float for pawsProgressMeter + } + else + { + ManaFlashSetting->SetText( "Disabled" ); + ((pawsShortcutWindow*)(ShortcutMenu))->SetManaFlashLevel( 0 ); + ((pawsShortcutWindow*)(ShortcutMenu))->SetManaOn( true ); + InfoWindow->SetManaFlashLevel( 0 ); + } +} + + +void pawsConfigHPandMana::SetDefault() +{ + LoadConfig(); +} + +bool pawsConfigHPandMana::OnScroll(int /*scrollDir*/, pawsScrollBar* wdg) +{ + if( !loaded ) return false; + + if(wdg == HPWarnLevel ) + { + if( HPWarnLevel->GetCurrentValue()>0 ) + { + if( HPWarnLevel->GetCurrentValue()<HPDangerLevel->GetCurrentValue() ) + { + HPDangerLevel->SetCurrentValue( HPWarnLevel->GetCurrentValue() ); + } + ((pawsShortcutWindow*)(ShortcutMenu))->SetHPWarnLevel( HPWarnLevel->GetCurrentValue()/100 ); + InfoWindow->SetHPWarnLevel( HPWarnLevel->GetCurrentValue()/100 ); + UpdateHPWarnLevel(); + } + } + else if(wdg == HPDangerLevel ) + { + if( HPDangerLevel->GetCurrentValue()>0 ) + { + if( HPDangerLevel->GetCurrentValue()>HPWarnLevel->GetCurrentValue() ) + { + HPDangerLevel->SetCurrentValue( HPWarnLevel->GetCurrentValue() ); + } + ((pawsShortcutWindow*)(ShortcutMenu))->SetHPDangerLevel( HPDangerLevel->GetCurrentValue()/100 ); + InfoWindow->SetHPDangerLevel( HPDangerLevel->GetCurrentValue()/100 ); + UpdateHPDangerLevel(); + } + } + else if(wdg == HPFlashLevel ) + { + if( HPFlashLevel->GetCurrentValue()>0 ) + { + ((pawsShortcutWindow*)(ShortcutMenu))->SetHPFlashLevel( HPFlashLevel->GetCurrentValue()/100 ); + InfoWindow->SetHPFlashLevel( HPFlashLevel->GetCurrentValue()/100 ); + } + UpdateHPFlashLevel(); + } + else if(wdg == ManaWarnLevel ) + { + if( ManaWarnLevel->GetCurrentValue()>0 ) + { + if( ManaWarnLevel->GetCurrentValue()<ManaDangerLevel->GetCurrentValue() ) + { + ManaDangerLevel->SetCurrentValue( ManaWarnLevel->GetCurrentValue() ); + } + ((pawsShortcutWindow*)(ShortcutMenu))->SetManaWarnLevel( ManaWarnLevel->GetCurrentValue()/100 ); + InfoWindow->SetManaWarnLevel( ManaWarnLevel->GetCurrentValue()/100 ); + UpdateManaWarnLevel(); + } + } + else if(wdg == ManaDangerLevel ) + { + if( ManaDangerLevel->GetCurrentValue()>0 ) + { + if( ManaDangerLevel->GetCurrentValue()>ManaWarnLevel->GetCurrentValue() ) + { + ManaDangerLevel->SetCurrentValue( ManaWarnLevel->GetCurrentValue() ); + } + ((pawsShortcutWindow*)(ShortcutMenu))->SetManaDangerLevel( ManaDangerLevel->GetCurrentValue()/100 ); + InfoWindow->SetManaDangerLevel( ManaDangerLevel->GetCurrentValue()/100 ); + UpdateManaDangerLevel(); + } + } + else if(wdg == ManaFlashLevel ) + { + if( ManaFlashLevel->GetCurrentValue()>0 ) + { + ((pawsShortcutWindow*)(ShortcutMenu))->SetManaFlashLevel( ManaFlashLevel->GetCurrentValue()/100 ); + InfoWindow->SetManaFlashLevel( ManaFlashLevel->GetCurrentValue()/100 ); + } + UpdateManaFlashLevel(); + } + + if( loaded ) + SaveConfig(); + ((pawsShortcutWindow*)ShortcutMenu)->Draw(); + InfoWindow->Draw(); + return true; +} + +bool pawsConfigHPandMana::OnButtonPressed(int /*button*/, int /*mod*/, pawsWidget* wdg) +{ + + return true; +} + +void pawsConfigHPandMana::Show() +{ + pawsWidget::Show(); +} + +void pawsConfigHPandMana::Hide() +{ + if(dirty) + { + } + + pawsWidget::Hide(); +} + + Property changes on: trunk/src/client/gui/pawsconfigHPandMana.cpp ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Added: trunk/src/client/gui/pawsconfigHPandMana.h =================================================================== --- trunk/src/client/gui/pawsconfigHPandMana.h (rev 0) +++ trunk/src/client/gui/pawsconfigHPandMana.h 2014-09-20 17:49:11 UTC (rev 9571) @@ -0,0 +1,113 @@ +/* + * pawsconfighpandmana.h - Author: Joe Lyon + * + * Copyright (C) 2014 Atomic Blue (in...@pl..., http://www.atomicblue.org) + * + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation (version 2 of the License) + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + */ + +#ifndef PAWS_CONFIG_HPANDMANA_HEADER +#define PAWS_CONFIG_HPANDMANA_HEADER + +// CS INCLUDES +#include <csutil/array.h> +#include <iutil/document.h> + +#include <csutil/csstring.h> +#include <csutil/stringarray.h> +#include <csutil/array.h> + + +// PAWS INCLUDES +#include "paws/pawswidget.h" +#include "paws/pawscombo.h" +#include "pawsconfigwindow.h" +#include "util/psxmlparser.h" +#include "shortcutwindow.h" +#include "pawsinfowindow.h" +#include "paws/pawscrollbar.h" + + +class pawsCheckBox; +class pawsScrollBar; + +class pawsRadioButtonGroup; + +/* + * class pawsConfigHPandMana is options screen for configuration of HPandMana Bar + */ +class pawsConfigHPandMana : public pawsConfigSectionWindow +{ +public: + pawsConfigHPandMana(); + + //from pawsWidget: + virtual bool PostSetup(); + virtual bool OnScroll(int,pawsScrollBar*); + virtual bool OnButtonPressed(int, int, pawsWidget*); + virtual void Show(); + virtual void Hide(); + + // from pawsConfigSectionWindow: + virtual bool Initialize(); + virtual bool LoadConfig(); + virtual bool SaveConfig(); + virtual void SetDefault(); + + void PickText( const char * fontName, int size ); + + void UpdateHPWarnLevel( ); + void UpdateHPDangerLevel( ); + void UpdateHPFlashLevel( ); + void UpdateManaWarnLevel( ); + void UpdateManaDangerLevel( ); + void UpdateManaFlashLevel( ); + + + +protected: + + pawsWidget* ShortcutMenu; + pawsScrollMenu* MenuBar; + pawsInfoWindow* InfoWindow; + + pawsScrollBar* HPWarnLevel; + pawsTextBox* HPWarnSetting; + + pawsScrollBar* HPDangerLevel; + pawsTextBox* HPDangerSetting; + + pawsScrollBar* HPFlashLevel; + pawsTextBox* HPFlashSetting; + + pawsScrollBar* ManaWarnLevel; + pawsTextBox* ManaWarnSetting; + + pawsScrollBar* ManaDangerLevel; + pawsTextBox* ManaDangerSetting; + + pawsScrollBar* ManaFlashLevel; + pawsTextBox* ManaFlashSetting; + + + bool loaded; + +}; + + +CREATE_PAWS_FACTORY(pawsConfigHPandMana); + + +#endif + Property changes on: trunk/src/client/gui/pawsconfigHPandMana.h ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Added: svn:keywords ## -0,0 +1 ## +Author Date Id Rev URL \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Modified: trunk/src/client/gui/pawsconfigshortcut.cpp =================================================================== --- trunk/src/client/gui/pawsconfigshortcut.cpp 2014-09-16 23:33:20 UTC (rev 9570) +++ trunk/src/client/gui/pawsconfigshortcut.cpp 2014-09-20 17:49:11 UTC (rev 9571) @@ -56,13 +56,7 @@ textSize(NULL), textSpacing(NULL), ShortcutMenu(NULL), - MenuBar(NULL), - HPWarnLevel(NULL), - HPDangerLevel(NULL), - HPFlashLevel(NULL), - ManaWarnLevel(NULL), - ManaDangerLevel(NULL), - ManaFlashLevel(NULL) + MenuBar(NULL) { loaded= false; } @@ -205,67 +199,6 @@ textSpacing->SetCurrentValue(4,false); textSpacing->SetMaxValue(20); - - HPWarnLevel = (pawsScrollBar*)FindWidget("HPWarnLevel"); - if(!HPWarnLevel) - { - return false; - } - HPWarnLevel->EnableValueLimit(true); - HPWarnLevel->SetMinValue(0); - HPWarnLevel->SetMaxValue(100); - HPWarnLevel->SetCurrentValue(0,false); - - HPDangerLevel = (pawsScrollBar*)FindWidget("HPDangerLevel"); - if(!HPDangerLevel) - { - return false; - } - HPDangerLevel->EnableValueLimit(true); - HPDangerLevel->SetMinValue(0); - HPDangerLevel->SetMaxValue(100); - HPDangerLevel->SetCurrentValue(0,false); - - HPFlashLevel = (pawsScrollBar*)FindWidget("HPFlashLevel"); - if(!HPFlashLevel) - { - return false; - } - HPFlashLevel->EnableValueLimit(true); - HPFlashLevel->SetMinValue(0); - HPFlashLevel->SetMaxValue(100); - HPFlashLevel->SetCurrentValue(0,false); - - ManaWarnLevel = (pawsScrollBar*)FindWidget("ManaWarnLevel"); - if(!ManaWarnLevel) - { - return false; - } - ManaWarnLevel->EnableValueLimit(true); - ManaWarnLevel->SetMinValue(0); - ManaWarnLevel->SetMaxValue(100); - ManaWarnLevel->SetCurrentValue(0,false); - - ManaDangerLevel = (pawsScrollBar*)FindWidget("ManaDangerLevel"); - if(!ManaDangerLevel) - { - return false; - } - ManaDangerLevel->EnableValueLimit(true); - ManaDangerLevel->SetMinValue(0); - ManaDangerLevel->SetMaxValue(100); - ManaDangerLevel->SetCurrentValue(0,false); - - ManaFlashLevel = (pawsScrollBar*)FindWidget("ManaFlashLevel"); - if(!ManaFlashLevel) - { - return false; - } - ManaFlashLevel->EnableValueLimit(true); - ManaFlashLevel->SetMinValue(0); - ManaFlashLevel->SetMaxValue(100); - ManaFlashLevel->SetCurrentValue(0,false); - return true; } @@ -351,14 +284,7 @@ } healthAndMana->SetState( ((pawsShortcutWindow*)ShortcutMenu)->GetMonitorState() ); - HPWarnLevel->SetCurrentValue( ((pawsShortcutWindow*)ShortcutMenu)->GetHPWarnLevel() ); - HPDangerLevel->SetCurrentValue( ((pawsShortcutWindow*)ShortcutMenu)->GetHPDangerLevel() ); - HPFlashLevel->SetCurrentValue( ((pawsShortcutWindow*)ShortcutMenu)->GetHPFlashLevel() ); - ManaWarnLevel->SetCurrentValue( ((pawsShortcutWindow*)ShortcutMenu)->GetManaWarnLevel() ); - ManaDangerLevel->SetCurrentValue( ((pawsShortcutWindow*)ShortcutMenu)->GetManaDangerLevel() ); - ManaFlashLevel->SetCurrentValue( ((pawsShortcutWindow*)ShortcutMenu)->GetManaFlashLevel() ); - enableScrollBar->TurnAllOff(); textSize->SetCurrentValue(MenuBar->GetFontSize()); @@ -396,19 +322,6 @@ xml.AppendFmt("<healthAndMana on=\"%s\" />\n", healthAndMana->GetState() ? "yes" : "no"); - xml.AppendFmt("<HPWarnLevel value=\"%d\" />\n", - int(HPWarnLevel->GetCurrentValue())); - xml.AppendFmt("<HPDangerLevel value=\"%d\" />\n", - int(HPDangerLevel->GetCurrentValue())); - xml.AppendFmt("<HPFlashLevel value=\"%d\" />\n", - int(HPFlashLevel->GetCurrentValue())); - xml.AppendFmt("<ManaWarnLevel value=\"%d\" />\n", - int(ManaWarnLevel->GetCurrentValue())); - xml.AppendFmt("<ManaDangerLevel value=\"%d\" />\n", - int(ManaDangerLevel->GetCurrentValue())); - xml.AppendFmt("<ManaFlashLevel value=\"%d\" />\n", - int(ManaFlashLevel->GetCurrentValue())); - xml.AppendFmt("<buttonBackground on=\"%s\" />\n", buttonBackground->GetState() ? "yes" : "no"); xml.AppendFmt("<textSize value=\"%d\" />\n", @@ -466,64 +379,6 @@ MenuBar->SetButtonPaddingWidth( textSpacing->GetCurrentValue() ); MenuBar->LayoutButtons(); } - else if(wdg == HPWarnLevel ) - { - if( HPWarnLevel->GetCurrentValue()>0 ) - { - if( HPWarnLevel->GetCurrentValue()<HPDangerLevel->GetCurrentValue() ) - { - HPDangerLevel->SetCurrentValue( HPWarnLevel->GetCurrentValue() ); - } - ((pawsShortcutWindow*)(ShortcutMenu))->SetHPWarnLevel( HPWarnLevel->GetCurrentValue()/100 ); - } - } - else if(wdg == HPDangerLevel ) - { - if( HPDangerLevel->GetCurrentValue()>0 ) - { - if( HPDangerLevel->GetCurrentValue()>HPWarnLevel->GetCurrentValue() ) - { - HPDangerLevel->SetCurrentValue( HPWarnLevel->GetCurrentValue() ); - } - ((pawsShortcutWindow*)(ShortcutMenu))->SetHPDangerLevel( HPDangerLevel->GetCurrentValue()/100 ); - } - } - else if(wdg == HPFlashLevel ) - { - if( HPFlashLevel->GetCurrentValue()>0 ) - { - ((pawsShortcutWindow*)(ShortcutMenu))->SetHPFlashLevel( HPFlashLevel->GetCurrentValue()/100 ); - } - } - else if(wdg == ManaWarnLevel ) - { - if( ManaWarnLevel->GetCurrentValue()>0 ) - { - if( ManaWarnLevel->GetCurrentValue()<ManaDangerLevel->GetCurrentValue() ) - { - ManaDangerLevel->SetCurrentValue( ManaWarnLevel->GetCurrentValue() ); - } - ((pawsShortcutWindow*)(ShortcutMenu))->SetManaWarnLevel( ManaWarnLevel->GetCurrentValue()/100 ); - } - } - else if(wdg == ManaDangerLevel ) - { - if( ManaDangerLevel->GetCurrentValue()>0 ) - { - if( ManaDangerLevel->GetCurrentValue()>ManaWarnLevel->GetCurrentValue() ) - { - ManaDangerLevel->SetCurrentValue( ManaWarnLevel->GetCurrentValue() ); - } - ((pawsShortcutWindow*)(ShortcutMenu))->SetManaDangerLevel( ManaDangerLevel->GetCurrentValue()/100 ); - } - } - else if(wdg == ManaFlashLevel ) - { - if( ManaFlashLevel->GetCurrentValue()>0 ) - { - ((pawsShortcutWindow*)(ShortcutMenu))->SetManaFlashLevel( ManaFlashLevel->GetCurrentValue()/100 ); - } - } if( loaded ) SaveConfig(); Modified: trunk/src/client/gui/pawsinfowindow.cpp =================================================================== --- trunk/src/client/gui/pawsinfowindow.cpp 2014-09-16 23:33:20 UTC (rev 9570) +++ trunk/src/client/gui/pawsinfowindow.cpp 2014-09-20 17:49:11 UTC (rev 9571) @@ -257,3 +257,102 @@ wdg->SetBackground(bg); } } + +void pawsInfoWindow::SetHPWarnLevel( float val ) +{ + if( main_hp ) + { + main_hp->SetWarningLevel(val,true); + } +} +float pawsInfoWindow::GetHPWarnLevel() +{ + if( main_hp ) + { + return main_hp->GetWarningLevel(); + } + return 0; +} + +void pawsInfoWindow::SetHPDangerLevel( float val ) +{ + if( main_hp ) + { + main_hp->SetDangerLevel(val,true); + } +} +float pawsInfoWindow::GetHPDangerLevel() +{ + if( main_hp ) + { + return main_hp->GetDangerLevel(); + } + return 0; +} + +void pawsInfoWindow::SetHPFlashLevel( float val ) +{ + if( main_hp ) + { + main_hp->SetFlashLevel(val,true); + main_hp->SetFlashRate(200); + } +} +float pawsInfoWindow::GetHPFlashLevel() +{ + if( main_hp ) + { + return main_hp->GetFlashLevel(); + } + return 0; +} + +void pawsInfoWindow::SetManaWarnLevel( float val ) +{ + if( main_mana ) + { + main_mana->SetWarningLevel(val,true); + } +} +float pawsInfoWindow::GetManaWarnLevel() +{ + if( main_mana ) + { + return main_mana->GetWarningLevel(); + } + return 0; +} + +void pawsInfoWindow::SetManaDangerLevel( float val ) +{ + if( main_mana ) + { + main_mana->SetDangerLevel(val,true); + } +} +float pawsInfoWindow::GetManaDangerLevel() +{ + if( main_mana ) + { + return main_mana->GetDangerLevel(); + } + return 0; +} + +void pawsInfoWindow::SetManaFlashLevel( float val ) +{ + if( main_mana ) + { + main_mana->SetFlashLevel(val,true); + main_mana->SetFlashRate(200); + } +} +float pawsInfoWindow::GetManaFlashLevel() +{ + if( main_mana ) + { + return main_mana->GetFlashLevel(); + } + return 0; +} + Modified: trunk/src/client/gui/pawsinfowindow.h =================================================================== --- trunk/src/client/gui/pawsinfowindow.h 2014-09-16 23:33:20 UTC (rev 9570) +++ trunk/src/client/gui/pawsinfowindow.h 2014-09-20 17:49:11 UTC (rev 9571) @@ -56,6 +56,24 @@ void SetStanceHighlight(uint stance); void UpdateAttkQueue(MsgEntry* me); + void SetHPWarnLevel( float val ); + float GetHPWarnLevel(); + + void SetHPDangerLevel( float val ); + float GetHPDangerLevel(); + + void SetHPFlashLevel( float val ); + float GetHPFlashLevel(); + + void SetManaWarnLevel( float val ); + float GetManaWarnLevel(); + + void SetManaDangerLevel( float val ); + float GetManaDangerLevel(); + + void SetManaFlashLevel( float val ); + float GetManaFlashLevel(); + private: pawsTextBox *targetName; pawsProgressBar *main_hp; Modified: trunk/src/client/gui/shortcutwindow.cpp =================================================================== --- trunk/src/client/gui/shortcutwindow.cpp 2014-09-16 23:33:20 UTC (rev 9570) +++ trunk/src/client/gui/shortcutwindow.cpp 2014-09-20 17:49:11 UTC (rev 9571) @@ -308,6 +308,7 @@ position = 0; LoadUserPrefs(); + LoadUserSharedPrefs(); return true; } @@ -1136,39 +1137,7 @@ { Error1("pawsShortcutWindow::LoadUserPrefs unable to retrieve healthAndMana node"); } - optionNode = mainNode->GetNode("HPWarnLevel"); - if(optionNode != NULL) - { - SetHPWarnLevel(optionNode->GetAttributeValueAsFloat("value", true)/100); - } - optionNode = mainNode->GetNode("HPDangerLevel"); - if(optionNode != NULL) - { - SetHPDangerLevel(optionNode->GetAttributeValueAsFloat("value", true)/100); - } - optionNode = mainNode->GetNode("HPFlashLevel"); - if(optionNode != NULL) - { - SetHPFlashLevel(optionNode->GetAttributeValueAsFloat("value", true)/100); - } - optionNode = mainNode->GetNode("ManaWarnLevel"); - if(optionNode != NULL) - { - SetManaWarnLevel(optionNode->GetAttributeValueAsFloat("value", true)/100); - } - optionNode = mainNode->GetNode("ManaDangerLevel"); - if(optionNode != NULL) - { - SetManaDangerLevel(optionNode->GetAttributeValueAsFloat("value", true)/100); - } - optionNode = mainNode->GetNode("ManaFlashLevel"); - if(optionNode != NULL) - { - SetManaFlashLevel(optionNode->GetAttributeValueAsFloat("value", true)/100); - } - - optionNode = mainNode->GetNode("buttonBackground"); if(optionNode != NULL) { @@ -1218,6 +1187,79 @@ return true; } + + +bool pawsShortcutWindow::LoadUserSharedPrefs() +{ + csRef<iDocument> doc; + csRef<iDocumentNode> root, + mainNode, + optionNode, + optionNode2; + + csString fileName; + fileName = "/planeshift/userdata/options/confighpandmana.xml"; + + if(!vfs->Exists(fileName)) + { + return true; //no saved config to load. + } + + doc = ParseFile(PawsManager::GetSingleton().GetObjectRegistry(), fileName); + if(doc == NULL) + { + Error2("pawsShortcutWindow::LoadUserPrefs Failed to parse file %s", fileName.GetData()); + return false; + } + root = doc->GetRoot(); + if(root == NULL) + { + Error2("pawsShortcutWindow::LoadUserPrefs : %s has no XML root",fileName.GetData()); + return false; + } + mainNode = root->GetNode("hpandmana"); + if(mainNode == NULL) + { + Error2("pawsShortcutWindow::LoadUserPrefs %s has no <hpandmana> tag",fileName.GetData()); + return false; + } + + optionNode = mainNode->GetNode("HPWarnLevel"); + if(optionNode != NULL) + { + SetHPWarnLevel(optionNode->GetAttributeValueAsFloat("value", true)/100); + } + optionNode = mainNode->GetNode("HPDangerLevel"); + if(optionNode != NULL) + { + SetHPDangerLevel(optionNode->GetAttributeValueAsFloat("value", true)/100); + } + optionNode = mainNode->GetNode("HPFlashLevel"); + if(optionNode != NULL) + { + SetHPFlashLevel(optionNode->GetAttributeValueAsFloat("value", true)/100); + } + + optionNode = mainNode->GetNode("ManaWarnLevel"); + if(optionNode != NULL) + { + SetManaWarnLevel(optionNode->GetAttributeValueAsFloat("value", true)/100); + } + optionNode = mainNode->GetNode("ManaDangerLevel"); + if(optionNode != NULL) + { + SetManaDangerLevel(optionNode->GetAttributeValueAsFloat("value", true)/100); + } + optionNode = mainNode->GetNode("ManaFlashLevel"); + if(optionNode != NULL) + { + SetManaFlashLevel(optionNode->GetAttributeValueAsFloat("value", true)/100); + } + + + return true; +} + void pawsShortcutWindow::SetHPWarnLevel( float val ) { if( main_hp ) @@ -1254,6 +1296,7 @@ { if( main_hp ) { +fprintf( stderr, "pawsShortcutWindow::SetHPFlashLevel( %f )\n", val ); main_hp->SetFlashLevel(val,true); main_hp->SetFlashRate(200); } @@ -1315,3 +1358,21 @@ } return 0; } + +void pawsShortcutWindow::SetHPOn( bool val ) +{ + if( main_hp ) + { + return main_hp->SetOn( val ); + } + return; +} + +void pawsShortcutWindow::SetManaOn( bool val ) +{ + if( main_mana ) + { + return main_mana->SetOn( val ); + } + return; +} Modified: trunk/src/client/gui/shortcutwindow.h =================================================================== --- trunk/src/client/gui/shortcutwindow.h 2014-09-16 23:33:20 UTC (rev 9570) +++ trunk/src/client/gui/shortcutwindow.h 2014-09-20 17:49:11 UTC (rev 9571) @@ -126,6 +126,7 @@ * Load the preferences set by the Shortcut Configuration interface */ bool LoadUserPrefs(); + bool LoadUserSharedPrefs(); void SetHPWarnLevel( float val ); float GetHPWarnLevel(); @@ -145,6 +146,8 @@ void SetManaFlashLevel( float val ); float GetManaFlashLevel(); + void SetHPOn( bool val ); + void SetManaOn( bool val ); protected: /// chat window for easy access @@ -183,8 +186,6 @@ virtual void HandleMessage(MsgEntry *msg); - - private: //status bars, optional;configured in XML pawsProgressBar *main_hp; Modified: trunk/src/client/psengine.cpp =================================================================== --- trunk/src/client/psengine.cpp 2014-09-16 23:33:20 UTC (rev 9570) +++ trunk/src/client/psengine.cpp 2014-09-20 17:49:11 UTC (rev 9571) @@ -137,6 +137,7 @@ #include "gui/pawsconfigchatlogs.h" #include "gui/pawsconfigsound.h" #include "gui/pawsconfigshortcut.h" +#include "gui/pawsconfigHPandMana.h" #include "gui/pawsconfigactivemagic.h" #include "gui/pawsconfigchatfont.h" #include "gui/pawsconfigentitylabels.h" @@ -812,6 +813,7 @@ RegisterFactory(pawsConfigCameraFactory); RegisterFactory(pawsConfigChatFactory); RegisterFactory(pawsConfigSoundFactory); + RegisterFactory(pawsConfigHPandManaFactory); RegisterFactory(pawsConfigShortcutFactory); RegisterFactory(pawsConfigActiveMagicFactory); RegisterFactory(pawsConfigChatFontFactory); Modified: trunk/src/common/paws/pawsprogressbar.cpp =================================================================== --- trunk/src/common/paws/pawsprogressbar.cpp 2014-09-16 23:33:20 UTC (rev 9570) +++ trunk/src/common/paws/pawsprogressbar.cpp 2014-09-20 17:49:11 UTC (rev 9571) @@ -331,4 +331,9 @@ return dangerLevel; } - +void pawsProgressBar::SetOn( bool val) +{ + On=val; + flashLastTime = csGetTicks(); + flashLevel = 0; +} Modified: trunk/src/common/paws/pawsprogressbar.h =================================================================== --- trunk/src/common/paws/pawsprogressbar.h 2014-09-16 23:33:20 UTC (rev 9570) +++ trunk/src/common/paws/pawsprogressbar.h 2014-09-20 17:49:11 UTC (rev 9571) @@ -135,6 +135,8 @@ */ void SetReversed( bool val ); + void SetOn( bool val ); + private: float totalValue; float flashLevel; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2014-09-20 21:41:27
|
Revision: 9572 http://sourceforge.net/p/planeshift/code/9572 Author: joelyon Date: 2014-09-20 21:41:23 +0000 (Sat, 20 Sep 2014) Log Message: ----------- Aiwendil's Craft book "/study" filter Modified Paths: -------------- trunk/data/gui/craft.xml trunk/src/client/gui/pawscraft.cpp trunk/src/client/gui/pawscraft.h Modified: trunk/data/gui/craft.xml =================================================================== --- trunk/data/gui/craft.xml 2014-09-20 17:49:11 UTC (rev 9571) +++ trunk/data/gui/craft.xml 2014-09-20 21:41:23 UTC (rev 9572) @@ -4,9 +4,34 @@ <frame x="70" y="70" width="670" height="285" border="yes"/> <title resource="Scaling Title Bar" text="Study notes:" align="left" close_button="yes"/> - <widget name="HelpText" factory="pawsMultiLineTextBox"> - <frame x="10" y="10" width="655" height="270" border="no"/> - </widget> + <widget name="HelpText" factory="pawsMultiLineTextBox"> + <frame x="10" y="10" width="655" height="230" border="no"/> + <attachpoints> + <attach point="PROPORTIONAL_RIGHT" /> + <attach point="ATTACH_LEFT" /> + <attach point="ATTACH_TOP" /> + <attach point="PROPORTIONAL_BOTTOM" /> + </attachpoints> + </widget> + <widget name="FilterLabel" factory="pawsTextBox"> + <frame x="10" y="255" width="60" height="20" border="no"/> + <text string="Filter:" /> + <attachpoints> + <attach point="ATTACH_RIGHT" /> + <attach point="ATTACH_LEFT" /> + <attach point="PROPORTIONAL_TOP" /> + <attach point="ATTACH_BOTTOM" /> + </attachpoints> + </widget> + <widget name="Filter" factory="pawsEditTextBox" resizable="no"> + <frame x="65" y="255" width="200" height="20"/> + <attachpoints> + <attach point="ATTACH_RIGHT" /> + <attach point="ATTACH_LEFT" /> + <attach point="PROPORTIONAL_TOP" /> + <attach point="ATTACH_BOTTOM" /> + </attachpoints> + </widget> </widget> </widget_description> Modified: trunk/src/client/gui/pawscraft.cpp =================================================================== --- trunk/src/client/gui/pawscraft.cpp 2014-09-20 17:49:11 UTC (rev 9571) +++ trunk/src/client/gui/pawscraft.cpp 2014-09-20 21:41:23 UTC (rev 9572) @@ -32,28 +32,51 @@ bool pawsCraftWindow::PostSetup() { psengine->GetMsgHandler()->Subscribe(this, MSGTYPE_CRAFT_INFO); + filterEditTextBox = dynamic_cast<pawsEditTextBox*>(FindWidget("Filter")); + if ( !filterEditTextBox ) { + Error1( "pawsCraftWindow::PostSetup failed to load widget 'Filter'"); + return false; + } + + textBox = dynamic_cast<pawsMultiLineTextBox*>(FindWidget("HelpText")); + if ( !textBox ) { + Error1( "pawsCraftWindow::PostSetup failed to load widget 'HelpText'"); + return false; + } + + // by default we set no filter + filter=""; + return true; } void pawsCraftWindow::Show() { - pawsWidget::Show(); - // Get craft info for mind item psMsgCraftingInfo msg; msg.SendMessage(); + + pawsWidget::Show(); } void pawsCraftWindow::HandleMessage( MsgEntry* me ) { - textBox = dynamic_cast<pawsMultiLineTextBox*>(FindWidget("HelpText")); +// textBox = dynamic_cast<pawsMultiLineTextBox*>(FindWidget("HelpText")); psMsgCraftingInfo mesg(me); - csString text(mesg.craftInfo); - text.ReplaceAll( "[[", " With higher "); - text.ReplaceAll( "]]", " skill you could: " ); - if (text) - textBox->SetText(text.GetData()); +// csString text(mesg.craftInfo); +// text.ReplaceAll( "[[", " With higher "); +// text.ReplaceAll( "]]", " skill you could: " ); +// if (text) +// textBox->SetText(text.GetData()); + // lets copy the text of the crafting info message + craftText = mesg.craftInfo; + // the folowing replacement should probably go to pawsCraftWindow::Format() as well + craftText.ReplaceAll( "[[", "With higher "); + craftText.ReplaceAll( "]]", " skill you could: " ); + // and format it for the output (apply filter) + Format(); + } /* @@ -113,3 +136,65 @@ */ return true; } + +void pawsCraftWindow::Draw() +{ + // did the filter change since the last draw? + if (filter != filterEditTextBox->GetText()) + { + // well I guess we have to do some reformating then + filter = filterEditTextBox->GetText(); + Format(); + } + // lets not forget to draw the widget + pawsWidget::Draw(); +} + +void pawsCraftWindow::Format() +{ + // first...if no filter is defined we just print out everything + if (filter == "") + { + textBox->SetText(craftText.GetData()); + return; + } + // okay...lets see what lines the user actually wants to see + csString outputText = ""; + // We don't really care about upper or lower case so just convert the filter to uppercase + csString upcaseFilter = filter; + upcaseFilter.Upcase(); + // now we split the whole crafting recipes text in individual lines and check if any of these lines contains the "filter" + csString tmpLine; + size_t oldNewLine = 0; + size_t foundNewLine = craftText.Find("\n", oldNewLine); + while (foundNewLine != (size_t)-1) + { + // we found a newline...so create a temporary string for this line + craftText.SubString(tmpLine, oldNewLine, foundNewLine-oldNewLine); + // and again...we only want upper case letters + tmpLine.Upcase(); + // So, lets see if this line contains the "filter" + if (tmpLine.Find(upcaseFilter) != (size_t)-1) + { + // we found it...so add the original line to the output text (reusing tmpLine as we don't need the uppercase version anymore) + craftText.SubString(tmpLine, oldNewLine, foundNewLine-oldNewLine); + outputText.Append(tmpLine); + } + // and lets go on with our search + oldNewLine = foundNewLine; + foundNewLine = craftText.Find("\n", oldNewLine+1); + } + // no more newlines found...so lets see if the remaining text fits the filter as well + craftText.SubString(tmpLine, oldNewLine, craftText.Length()-oldNewLine); + // yeah, yeah...uppercase + tmpLine.Upcase(); + if (tmpLine.Find(upcaseFilter) != (size_t)-1) + { + // found it + craftText.SubString(tmpLine, oldNewLine, craftText.Length()-oldNewLine); + outputText.Append(tmpLine); + } + // last but not least...set the text to our found crafting recipes + textBox->SetText(outputText.GetData()); +} + Modified: trunk/src/client/gui/pawscraft.h =================================================================== --- trunk/src/client/gui/pawscraft.h 2014-09-20 17:49:11 UTC (rev 9571) +++ trunk/src/client/gui/pawscraft.h 2014-09-20 21:41:23 UTC (rev 9572) @@ -24,7 +24,9 @@ class pawsSimpleTree; class pawsMultiLineTextBox; +class pawsEditTextBox; + /** Window Widget that displays information about the mind item to * be used in crafting. * @@ -39,24 +41,23 @@ virtual void Show(); void HandleMessage( MsgEntry* me ); bool OnSelected(pawsWidget* widget); -/* - struct TreeNode - { - csString name; - csString equipment; - csString workItem; - int count; - }; -*/ + csString craftText; // contains the complete set of available carfting recipes + csString filter; // contains the currently used filter for the crafting recipes + /** Draw + * + * overwriting this to be able to do some reformating of the text is necessary + */ + virtual void Draw(); + /** Format method for the output text + * + * This method sets the actual on-screen text by filtering all unwanted lines + */ + void Format(); protected: -// csPDelArray< TreeNode > nodes; pawsMultiLineTextBox* textBox; - -// pawsSimpleTree* itemTree; - -// void Add( const char* parent, const char* realParent, psMsgCraftingInfo::CraftingItem* item ); - + pawsEditTextBox* filterEditTextBox; + }; CREATE_PAWS_FACTORY( pawsCraftWindow ); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2014-09-24 14:25:43
|
Revision: 9578 http://sourceforge.net/p/planeshift/code/9578 Author: joelyon Date: 2014-09-24 14:25:41 +0000 (Wed, 24 Sep 2014) Log Message: ----------- -Added help button and sub window on glyph window Modified Paths: -------------- trunk/data/gui/glyph.xml trunk/src/client/gui/pawsglyphwindow.cpp trunk/src/client/gui/pawsglyphwindow.h Modified: trunk/data/gui/glyph.xml =================================================================== --- trunk/data/gui/glyph.xml 2014-09-23 18:37:32 UTC (rev 9577) +++ trunk/data/gui/glyph.xml 2014-09-24 14:25:41 UTC (rev 9578) @@ -23,7 +23,7 @@ <bgimage resource="Cast Magic" /> </widget> - <widget name="SpellImage" factory="pawsWidget" id="1004"> + <widget name="SpellImage" factory="pawsWidget" id="1004" > <frame x="10" y="10" width="60" height="60" border="yes" /> </widget> @@ -208,20 +208,19 @@ <frame x="10" y="95" width="190" height="200" border="no"/> </widget> - <widget name="ignore" factory="pawsTextBox" tooltip="Click for help"> + <widget name="HelpIcon" factory="pawsTextBox" tooltip="Click for help" id="1005" > <frame x="130" y="355" width="30" height="30" /> <font name="/planeshift/data/ttf/cupandtalon.ttf" r="121" g="147" b="42" size="20" bold="yes" /> <text string="?" /> - <eventMouseDown>Ret=magichelp:Show()</eventMouseDown> </widget> - - <widget name="magichelp" factory="pawsWidget" visible="no" savepositions="no" movable="no" resizable="no" configurable="no" style="New Standard GUI" alwaysontop="yes"> + + <widget name="magichelp" factory="pawsWidget" visible="no" savepositions="no" movable="no" resizable="no" configurable="no" style="New Standard GUI" alwaysontop="yes"> <frame x="30" y="30" width="330" height="240" border="yes" visible="yes" /> <title resource="Scaling Title Bar" text="Magic Help" align="left" close_button="yes" /> <widget name="Infobox1" factory="pawsMultiLineTextBox" style="Standard Font"> <frame x="5" y="0" width="320" height="260" /> <text string="Purifying Glyphs: -To purify a glyph you must pick one up and then drop it onto the 'purify' icon. You then have to wait for the purification to finish, you will see the background change and you will get a system message saying it has finished. +To purify a glyph you must pick one up and then drop it onto the 'purify' icon. You then have to wait for the purification to finish. Once it has finished you will see the background of the glyph icon change and you will get a system message saying it has finished. Researching Spells: To research a spell you must first purify every glyph you want to use. Then, taking between 1 and 4 purified glyphs place them in any order you want to try in the 4 spell research slots. Once you have placed 1, 2, 3, or 4 purified glyphs there you then click the research spell button. You may not always succeed when researching spells so you may have to click many times. You also need to have the necessary skill level required to find specific spells. The order of glyphs is also important." /> Modified: trunk/src/client/gui/pawsglyphwindow.cpp =================================================================== --- trunk/src/client/gui/pawsglyphwindow.cpp 2014-09-23 18:37:32 UTC (rev 9577) +++ trunk/src/client/gui/pawsglyphwindow.cpp 2014-09-24 14:25:41 UTC (rev 9578) @@ -46,10 +46,11 @@ #include "paws/pawslistbox.h" -#define PURIFY_BUTTON 1000 -#define SAVE_BUTTON 1001 -#define CAST_BUTTON 1002 -#define RESEARCH_BUTTON 1003 +#define PURIFY_BUTTON 1000 +#define SAVE_BUTTON 1001 +#define CAST_BUTTON 1002 +#define RESEARCH_BUTTON 1003 +#define HELP_BUTTON 1005 @@ -59,8 +60,12 @@ // ////////////////////////////////////////////////////////////////////// -pawsGlyphWindow::pawsGlyphWindow() - +pawsGlyphWindow::pawsGlyphWindow() : + description(NULL), + spellName(NULL), + spellImage(NULL), + helpButton(NULL), + helpWindow(NULL) { for (int i = 0; i < GLYPH_ASSEMBLER_SLOTS; i++) assembler[i] = NULL; @@ -106,6 +111,12 @@ spellImage = FindWidget("SpellImage"); if ( !spellImage ) return false; + helpButton = (pawsTextBox *)FindWidget("HelpIcon"); + if ( !helpButton ) return false; + + helpWindow = FindWidget("magichelp"); + if ( !helpWindow ) return false; + ways.SetSize(GLYPH_WAYS); ways[0] = dynamic_cast <pawsListBox*> (FindWidget("crystal")); @@ -261,7 +272,8 @@ bool pawsGlyphWindow::OnMouseDown(int button, int modifiers, int x, int y) { - pawsGlyphSlot* widget = dynamic_cast<pawsGlyphSlot*>(WidgetAt(x, y)); + pawsWidget *widget = WidgetAt(x,y); + if(widget) { return OnButtonPressed(button, modifiers, widget); @@ -272,44 +284,52 @@ bool pawsGlyphWindow::OnButtonPressed(int /*mouseButton*/, int /*keyModifier*/, pawsWidget* widget) { - pawsWidget *dndWidget = PawsManager::GetSingleton().GetDragDropWidget(); + pawsWidget *dndWidget = PawsManager::GetSingleton().GetDragDropWidget(); pawsGlyphSlot *floatingSlot = dynamic_cast <pawsGlyphSlot*> (dndWidget); - pawsGlyphSlot *clickedSlot = dynamic_cast <pawsGlyphSlot*> (widget); - csString slotName = widget->GetName(); + pawsGlyphSlot *clickedSlot = dynamic_cast <pawsGlyphSlot*> (widget); + csString slotName = widget->GetName(); - // Check to see if this was the purify button. - if ( widget->GetID() == PURIFY_BUTTON ) + + switch( widget->GetID() ) { - if (floatingSlot!=NULL && floatingSlot->GetPurifyStatus()==0) + case PURIFY_BUTTON : { - psPurifyGlyphMessage mesg( floatingSlot->GetStatID() ); - mesg.SendMessage(); + if (floatingSlot!=NULL && floatingSlot->GetPurifyStatus()==0) + { + psPurifyGlyphMessage mesg( floatingSlot->GetStatID() ); + mesg.SendMessage(); - PawsManager::GetSingleton().SetDragDropWidget(NULL); + PawsManager::GetSingleton().SetDragDropWidget(NULL); + } + return true; } - return true; - } - // Check to see if this was the cast button. - if ( widget->GetID() == CAST_BUTTON ) - { - if (!spellName->GetText()) + case CAST_BUTTON : + { + if (!spellName->GetText()) + return true; + + if (strcmp(spellName->GetText(),"")!=0) + { + csString name(spellName->GetText()); + psSpellCastMessage mesg( name, psengine->GetKFactor() ); + mesg.SendMessage(); + } return true; + } - if (strcmp(spellName->GetText(),"")!=0) + case RESEARCH_BUTTON : { - csString name(spellName->GetText()); - psSpellCastMessage mesg( name, psengine->GetKFactor() ); - mesg.SendMessage(); + SendAssembler(); + return true; } - return true; - } - // Check to see if this was the research button. - if ( widget->GetID() == RESEARCH_BUTTON ) - { - SendAssembler(); - return true; + case HELP_BUTTON : + { + helpWindow->Show(); + PawsManager::GetSingleton().SetCurrentFocusedWidget(helpWindow); + return true; + } } if (clickedSlot == NULL) Modified: trunk/src/client/gui/pawsglyphwindow.h =================================================================== --- trunk/src/client/gui/pawsglyphwindow.h 2014-09-23 18:37:32 UTC (rev 9577) +++ trunk/src/client/gui/pawsglyphwindow.h 2014-09-24 14:25:41 UTC (rev 9578) @@ -114,9 +114,11 @@ /*** Clears the Spell name and Description fields. ***/ void ClearSpell(); - pawsMessageTextBox * description; - pawsTextBox * spellName; - pawsWidget *spellImage; + pawsMessageTextBox *description; + pawsTextBox *spellName; + pawsWidget *spellImage; + pawsTextBox *helpButton; + pawsWidget *helpWindow; csArray <pawsListBox*> ways; pawsGlyphSlot * assembler[GLYPH_ASSEMBLER_SLOTS]; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2014-09-25 19:44:38
|
Revision: 9583 http://sourceforge.net/p/planeshift/code/9583 Author: joelyon Date: 2014-09-25 19:44:30 +0000 (Thu, 25 Sep 2014) Log Message: ----------- Natoka's npcdialog_give_v2. Modified Paths: -------------- trunk/data/gui/dialog.xml trunk/src/client/gui/pawsnpcdialog.cpp trunk/src/client/gui/pawsnpcdialog.h Modified: trunk/data/gui/dialog.xml =================================================================== --- trunk/data/gui/dialog.xml 2014-09-24 23:47:40 UTC (rev 9582) +++ trunk/data/gui/dialog.xml 2014-09-25 19:44:30 UTC (rev 9583) @@ -113,6 +113,17 @@ </widget> </widget> + <widget name="GiveBubble" factory="pawsButton" visible="yes"> + <frame x="650" y="400" width="140" height="58" border="no" /> + <bgimage resource="InputBubble" /> + + <widget name="GiveTrigger" factory="pawsTextBox" style="textinput"> + <frame x="40" y="10" width="35" height="40" border="no" /> + <font r="168" g="183" b="206" size="12" bold="yes" /> + <text string="Give" /> + </widget> + </widget> + <widget name="FreeBubble" factory="pawsWidget" visible="yes"> <frame x="630" y="155" width="294" height="100" border="no" /> <bgimage resource="InputBubble" /> Modified: trunk/src/client/gui/pawsnpcdialog.cpp =================================================================== --- trunk/src/client/gui/pawsnpcdialog.cpp 2014-09-24 23:47:40 UTC (rev 9582) +++ trunk/src/client/gui/pawsnpcdialog.cpp 2014-09-25 19:44:30 UTC (rev 9583) @@ -45,6 +45,8 @@ { responseList = NULL; speechBubble = NULL; + closeBubble = NULL; + giveBubble = NULL; useBubbles = false; ticks = 0; cameraMode = 0; @@ -66,8 +68,9 @@ speechBubble = FindWidget("SpeechBubble"); textBox = dynamic_cast<pawsEditTextBox*>(FindWidget("InputText")); closeBubble = dynamic_cast<pawsButton*>(FindWidget("CloseBubble")); + giveBubble = dynamic_cast<pawsButton*>(FindWidget("GiveBubble")); - if(!responseList || !FindWidget("Lists") || !speechBubble || !FindWidget("Bubbles") || !closeBubble) + if(!responseList || !FindWidget("Lists") || !speechBubble || !FindWidget("Bubbles") || !closeBubble || !giveBubble) { return false; } @@ -159,8 +162,8 @@ unsigned long value = strtoul(answer.GetData() + pos + 1, NULL, 0); questID = value; // check for overflows - if(questID < -1) - { + if(questID < -1) + { questID = -1; } @@ -230,8 +233,8 @@ unsigned long value = strtoul(trigger.GetData() + pos + 1, NULL, 0); questID = value; // check for overflows - if(questID < -1) - { + if(questID < -1) + { questID = -1; } } @@ -268,6 +271,12 @@ { clickedOnResponseBubble = true; } + else if(name == "GiveBubble") + { + // give button was pressed + csString cmd = "/give"; + psengine->GetCmdHandler()->Publish(cmd); + } // process the left/right arrow clicking event else { @@ -438,8 +447,8 @@ unsigned long value = strtoul(trigger.GetData() + pos + 1, NULL, 0); questID = value; // check for overflows - if(questID < -1) - { + if(questID < -1) + { questID = -1; } @@ -505,6 +514,7 @@ AdjustForPromptWindow(); // should be done before DisplayQuestBubbles DisplayQuestBubbles(displayIndex); gotNewMenu = true; + giveBubble->Show(); } else { @@ -588,6 +598,7 @@ FindWidget("LeftArrow")->Hide(); FindWidget("RightArrow")->Hide(); FindWidget("FreeBubble")->Hide(); + FindWidget("GiveBubble")->Hide(); ticks = csGetTicks(); timeDelay = (csTicks)(2000 + 50*strlen(inText.GetData()) + 2000); // add 2 seconds for network delay @@ -706,6 +717,7 @@ SetSize(defaultFrame.Width(), defaultFrame.Height()); CenterTo(graphics2D->GetWidth() / 2, graphics2D->GetHeight() / 2); FindWidget("FreeBubble")->Show(); + giveBubble->Show(); textBox->Clear(); } else @@ -715,6 +727,7 @@ lists->Show(); responseList->Show(); bubbles->Hide(); + giveBubble->Hide(); SetMovable(true); psengine->GetPSCamera()->LockCameraMode(false); psengine->GetCharManager()->LockTarget(false); @@ -731,6 +744,7 @@ FindWidget("RightArrow")->Hide(); dynamic_cast<pawsMultiLineTextBox*>(speechBubble->FindWidget("BubbleText"))->SetText(""); FindWidget("SpeechBubble")->Hide(); + giveBubble->Hide(); displayIndex = 0; questInfo.DeleteAll(); DisplayQuestBubbles(0); Modified: trunk/src/client/gui/pawsnpcdialog.h =================================================================== --- trunk/src/client/gui/pawsnpcdialog.h 2014-09-24 23:47:40 UTC (rev 9582) +++ trunk/src/client/gui/pawsnpcdialog.h 2014-09-25 19:44:30 UTC (rev 9583) @@ -46,7 +46,11 @@ }; pawsNpcDialogWindow(); + /** + * Aquire pointers to widgets and load settings for the npc dialog. + */ bool PostSetup(); + void HandleMessage(MsgEntry* me); void OnListAction(pawsListBox* widget, int status); @@ -84,6 +88,9 @@ virtual void Hide(); bool OnKeyDown(utf32_char keyCode, utf32_char key, int modifiers); bool OnMouseDown(int button, int modifiers, int x , int y); + /** + * callback function called when a pawsButton (bubble) is clicked + */ bool OnButtonPressed(int button, int keyModifier, pawsWidget* widget); // This window should always stay on the background @@ -173,13 +180,15 @@ bool enabledChatBubbles; ///< Stores the state of chat bubbles. bool clickedOnResponseBubble; ///< flag when player clicks on the response bubble bool gotNewMenu; ///< keeps track of the incoming new menu message - csTicks timeDelay; ///< calculates the time needed to read the last npc say + csTicks timeDelay; ///< calculates the time needed to read the last npc say int questIDFree; ///< Keeps the value of the quest if the free text question was triggered. pawsListBox* responseList; pawsWidget* speechBubble; pawsEditTextBox* textBox; pawsButton* closeBubble; + pawsButton* giveBubble; + csTicks ticks; EID targetEID; ///< The eid of the current target used to hide the dialog if the actor is removed. }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2014-09-26 04:13:06
|
Revision: 9584 http://sourceforge.net/p/planeshift/code/9584 Author: joelyon Date: 2014-09-26 04:13:03 +0000 (Fri, 26 Sep 2014) Log Message: ----------- Defect 6610 - glyph window not movable Modified Paths: -------------- trunk/data/gui/glyph.xml trunk/src/client/gui/pawsglyphwindow.cpp trunk/src/client/gui/pawsglyphwindow.h Modified: trunk/data/gui/glyph.xml =================================================================== --- trunk/data/gui/glyph.xml 2014-09-25 19:44:30 UTC (rev 9583) +++ trunk/data/gui/glyph.xml 2014-09-26 04:13:03 UTC (rev 9584) @@ -208,24 +208,27 @@ <frame x="10" y="95" width="190" height="200" border="no"/> </widget> - <widget name="HelpIcon" factory="pawsTextBox" tooltip="Click for help" id="1005" > + <widget name="HelpIcon" factory="pawsButton" tooltip="Click for help" id="1005" > <frame x="130" y="355" width="30" height="30" /> <font name="/planeshift/data/ttf/cupandtalon.ttf" r="121" g="147" b="42" size="20" bold="yes" /> - <text string="?" /> - </widget> + <label text="?" /> + </widget> +</widget> - <widget name="magichelp" factory="pawsWidget" visible="no" savepositions="no" movable="no" resizable="no" configurable="no" style="New Standard GUI" alwaysontop="yes"> - <frame x="30" y="30" width="330" height="240" border="yes" visible="yes" /> - <title resource="Scaling Title Bar" text="Magic Help" align="left" close_button="yes" /> - <widget name="Infobox1" factory="pawsMultiLineTextBox" style="Standard Font"> - <frame x="5" y="0" width="320" height="260" /> - <text string="Purifying Glyphs: +<widget name="magichelp" factory="pawsWidget" + visible="no" savepositions="no" movable="yes" + resizable="no" configurable="no" + style="New Standard GUI" alwaysontop="yes"> + <frame x="30" y="30" width="330" height="240" border="yes" visible="yes" /> + <title resource="Scaling Title Bar" text="Magic Help" align="left" close_button="yes" /> + <widget name="Infobox1" factory="pawsMultiLineTextBox" style="Standard Font"> + <frame x="5" y="0" width="320" height="260" /> + <text string="Purifying Glyphs: To purify a glyph you must pick one up and then drop it onto the 'purify' icon. You then have to wait for the purification to finish. Once it has finished you will see the background of the glyph icon change and you will get a system message saying it has finished. Researching Spells: To research a spell you must first purify every glyph you want to use. Then, taking between 1 and 4 purified glyphs place them in any order you want to try in the 4 spell research slots. Once you have placed 1, 2, 3, or 4 purified glyphs there you then click the research spell button. You may not always succeed when researching spells so you may have to click many times. You also need to have the necessary skill level required to find specific spells. The order of glyphs is also important." /> - </widget> </widget> - </widget> + </widget_description> Modified: trunk/src/client/gui/pawsglyphwindow.cpp =================================================================== --- trunk/src/client/gui/pawsglyphwindow.cpp 2014-09-25 19:44:30 UTC (rev 9583) +++ trunk/src/client/gui/pawsglyphwindow.cpp 2014-09-26 04:13:03 UTC (rev 9584) @@ -111,12 +111,9 @@ spellImage = FindWidget("SpellImage"); if ( !spellImage ) return false; - helpButton = (pawsTextBox *)FindWidget("HelpIcon"); + helpButton = dynamic_cast <pawsButton*> (FindWidget("HelpIcon")); if ( !helpButton ) return false; - helpWindow = FindWidget("magichelp"); - if ( !helpWindow ) return false; - ways.SetSize(GLYPH_WAYS); ways[0] = dynamic_cast <pawsListBox*> (FindWidget("crystal")); @@ -272,8 +269,8 @@ bool pawsGlyphWindow::OnMouseDown(int button, int modifiers, int x, int y) { - pawsWidget *widget = WidgetAt(x,y); - + //pawsWidget *widget = WidgetAt(x,y); +pawsGlyphSlot* widget = dynamic_cast<pawsGlyphSlot*>(WidgetAt(x, y)); if(widget) { return OnButtonPressed(button, modifiers, widget); @@ -326,8 +323,18 @@ case HELP_BUTTON : { - helpWindow->Show(); - PawsManager::GetSingleton().SetCurrentFocusedWidget(helpWindow); + if( !helpWindow ) + helpWindow = PawsManager::GetSingleton().FindWidget("magichelp"); + if (!helpWindow ) + { + Error1( "pawsGlyphWindow::OnButtonPressed unable to read helpWindow widget!!\n"); + return false; + } + + if( !helpWindow->IsVisible() ) + helpWindow->Show(); + else + helpWindow->Hide(); return true; } } Modified: trunk/src/client/gui/pawsglyphwindow.h =================================================================== --- trunk/src/client/gui/pawsglyphwindow.h 2014-09-25 19:44:30 UTC (rev 9583) +++ trunk/src/client/gui/pawsglyphwindow.h 2014-09-26 04:13:03 UTC (rev 9584) @@ -117,7 +117,7 @@ pawsMessageTextBox *description; pawsTextBox *spellName; pawsWidget *spellImage; - pawsTextBox *helpButton; + pawsButton *helpButton; pawsWidget *helpWindow; csArray <pawsListBox*> ways; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2014-09-26 18:04:38
|
Revision: 9585 http://sourceforge.net/p/planeshift/code/9585 Author: joelyon Date: 2014-09-26 18:04:29 +0000 (Fri, 26 Sep 2014) Log Message: ----------- BoNeeMod's lootall buttons patch Modified Paths: -------------- trunk/data/gui/loot.xml trunk/src/client/gui/pawslootwindow.cpp trunk/src/client/gui/pawslootwindow.h Modified: trunk/data/gui/loot.xml =================================================================== --- trunk/data/gui/loot.xml 2014-09-26 04:13:03 UTC (rev 9584) +++ trunk/data/gui/loot.xml 2014-09-26 18:04:29 UTC (rev 9585) @@ -15,6 +15,16 @@ <bgimage resource="ButtonPickup" /> </widget> + <widget name="TakeAll" factory="pawsButton" id="300" tooltip="Take all items"> + <frame x="10" y="5" width="48" height="48" /> + <bgimage resource="ButtonPickup" /> + </widget> + + <widget name="RollAll" factory="pawsButton" id="400" tooltip="Roll for all items"> + <frame x="60" y="5" width="48" height="48" /> + <bgimage resource="ButtonPickup" /> + </widget> + <widget name="LootList" factory="pawsListBox" xmlbinding="loot" > <frame x="10" y="60" width="270" height="330" border="no"/> Modified: trunk/src/client/gui/pawslootwindow.cpp =================================================================== --- trunk/src/client/gui/pawslootwindow.cpp 2014-09-26 04:13:03 UTC (rev 9584) +++ trunk/src/client/gui/pawslootwindow.cpp 2014-09-26 18:04:29 UTC (rev 9585) @@ -22,6 +22,10 @@ #include <psconfig.h> #include "globals.h" +// CLIENT INCLUDES +#include "pscelclient.h" + + // COMMON/NET INCLUDES #include "net/messages.h" #include "net/clientmsghandler.h" @@ -36,7 +40,10 @@ #define ROLL_BUTTON 100 #define TAKE_BUTTON 200 +#define ROLLALL_BUTTON 300 +#define TAKEALL_BUTTON 400 + ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// @@ -67,9 +74,13 @@ msgqueue->Subscribe(this, MSGTYPE_LOOT); msgqueue->Subscribe(this, MSGTYPE_LOOTREMOVE); - // Grab the pointer to the petition listbox: + // Grab the pointer to the loot listbox: lootList = (pawsListBox*)FindWidget("LootList"); + // grab the pointer to the roll buttons + Roll_btn = (pawsButton*)FindWidget(ROLL_BUTTON); + RollAll_btn = (pawsButton*)FindWidget(ROLLALL_BUTTON); + return true; } @@ -83,7 +94,7 @@ char* buff = csStrNew(cmd); // Check which command was invoked: - if ( !strncmp(buff+1, "petition_list", 13)) + if ( !strncmp(buff+1, "loot_list", 13)) { // First, display this window to the user Show(); @@ -101,12 +112,12 @@ { case MSGTYPE_LOOT: { - // Get the petition message data from the server + // Get the loot message data from the server psLootMessage message(me); lootEntity = message.entity_id; - // Clear the list box and add the user's petitions + // Clear the list box and add the user's loots lootList->Clear(); lootList->SelfPopulateXML(message.lootxml); @@ -126,6 +137,20 @@ if (lootList->GetRowCount() > 0) { lootList->Select(lootList->GetRow(0),false); // Select first as default + GEMClientActor* player = psengine->GetCelClient()->GetMainPlayer(); // get the player + if (player->GetGroupID() == 0) // if player is not grouped, hide the roll buttons + { + grouped = false; + Roll_btn->Hide(); + RollAll_btn->Hide(); + } + else + { + grouped = true; + Roll_btn->Show(); + RollAll_btn->Show(); + } + Show(); } break; @@ -199,6 +224,18 @@ } break; } + + case TAKEALL_BUTTON: + { + psengine->GetCmdHandler()->Execute("/loot all"); + break; + } + + case ROLLALL_BUTTON: + { + psengine->GetCmdHandler()->Execute("/loot roll all"); + break; + } } return true; Modified: trunk/src/client/gui/pawslootwindow.h =================================================================== --- trunk/src/client/gui/pawslootwindow.h 2014-09-26 04:13:03 UTC (rev 9584) +++ trunk/src/client/gui/pawslootwindow.h 2014-09-26 18:04:29 UTC (rev 9585) @@ -71,12 +71,19 @@ /// Quicker way to set text for each column in the listbox: void SetText(int rowNum, int colNum, const char* fmt, ...); - /// Function to add the petitions to the listbox given a csArray; + /// Function to add the loot to the listbox given a csArray; void AddLootItem(); - /// List widget of petitions for easy access + /// List widget of loot for easy access pawsListBox* lootList; + /// group roll buttons + pawsButton* Roll_btn; + pawsButton* RollAll_btn; + + bool grouped; + + EID lootEntity; }; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2014-10-03 20:57:07
|
Revision: 9589 http://sourceforge.net/p/planeshift/code/9589 Author: joelyon Date: 2014-10-03 20:56:53 +0000 (Fri, 03 Oct 2014) Log Message: ----------- Natoka's chatclick_and_npcdialogmenu patch Modified Paths: -------------- trunk/data/gui/configpopup.xml trunk/data/options/npcdialog_def.xml trunk/src/client/gui/pawsconfigpopup.cpp trunk/src/client/gui/pawsconfigpopup.h trunk/src/client/gui/pawsnpcdialog.cpp trunk/src/client/gui/pawsnpcdialog.h trunk/src/server/bulkobjects/dictionary.cpp trunk/src/server/bulkobjects/dictionary.h trunk/src/server/bulkobjects/psquest.cpp trunk/src/server/bulkobjects/psquest.h trunk/src/server/bulkobjects/psquestprereqops.cpp trunk/src/server/bulkobjects/psquestprereqops.h trunk/src/server/cachemanager.cpp trunk/src/server/gem.cpp trunk/src/server/questmanager.cpp trunk/src/server/questmanager.h trunk/src/server/scripting.cpp trunk/src/server/scripting.h Modified: trunk/data/gui/configpopup.xml =================================================================== --- trunk/data/gui/configpopup.xml 2014-10-02 23:17:58 UTC (rev 9588) +++ trunk/data/gui/configpopup.xml 2014-10-03 20:56:53 UTC (rev 9589) @@ -38,6 +38,25 @@ <frame x="10" y="140" width="300" height="20" border="no" /> <text string="Use NPC Dialog" /> </widget> + + <widget factory="pawsTextBox" name="NPC Message Timeout Label"> + <frame x="40" y="160" width="140" height="20" border="no" /> + <text string="NPC Message Timeout"/> + </widget> + + <widget factory="pawsTextBox" name="NPC Message Timeout Label 2"> + <frame x="187" y="160" width="15" height="20" border="no" /> + <text string="0x"/> + </widget> + + <widget name="NpcMsgTimeoutScale" factory="pawsScrollBar" direction="horizontal" style="Standard Scrollbar Horizontal"> + <frame x="205" y="160" width="100" height="20" border="no" /> + </widget> + + <widget factory="pawsTextBox" name="NPC Message Timeout Label 3"> + <frame x="310" y="160" width="20" height="20" border="no" /> + <text string="? x"/> + </widget> </widget> </widget_description> Modified: trunk/data/options/npcdialog_def.xml =================================================================== --- trunk/data/options/npcdialog_def.xml 2014-10-02 23:17:58 UTC (rev 9588) +++ trunk/data/options/npcdialog_def.xml 2014-10-03 20:56:53 UTC (rev 9589) @@ -1,6 +1,8 @@ <npcdialog> <npcdialogoptions> <usenpcdialog value="1"/> + <npcmessagetimeoutscale value="1.0"/> + <npcmessagetimeoutscalemax value="5.0"/> </npcdialogoptions> </npcdialog> Modified: trunk/src/client/gui/pawsconfigpopup.cpp =================================================================== --- trunk/src/client/gui/pawsconfigpopup.cpp 2014-10-02 23:17:58 UTC (rev 9588) +++ trunk/src/client/gui/pawsconfigpopup.cpp 2014-10-03 20:56:53 UTC (rev 9589) @@ -91,6 +91,17 @@ useNpcDialogBubbles = (pawsCheckBox*)FindWidget("UseNpcDialogBubbles"); if (!useNpcDialogBubbles) return false; + + npcMsgTimeoutScale = (pawsScrollBar*)FindWidget("NpcMsgTimeoutScale"); + if (!npcMsgTimeoutScale) + return false; + + pawsTextBox* scaleFactorMax = (pawsTextBox*)FindWidget("NPC Message Timeout Label 3"); + if (!scaleFactorMax) + return false; + csString maxFactor; + maxFactor.Format("%.0fx", npcDialog->GetNpcMsgTimeoutScaleMax()); + scaleFactorMax->SetText(maxFactor); //we set all checkboxes as true by default for(size_t i = 0; i < children.GetSize(); i++) @@ -118,6 +129,11 @@ showActiveMagicConfig->SetState(!magicWindow->showWindow->GetState()); useNpcDialogBubbles->SetState(npcDialog->GetUseBubbles()); + npcMsgTimeoutScale->SetMaxValue(npcDialog->GetNpcMsgTimeoutScaleMax()); + npcMsgTimeoutScale->SetMinValue(0.0f); + npcMsgTimeoutScale->SetCurrentValue(npcDialog->GetNpcMsgTimeoutScale()); + npcMsgTimeoutScale->EnableValueLimit(true); + npcMsgTimeoutScale->SetTickValue(npcDialog->GetNpcMsgTimeoutScaleMax()/100.0f); //we take for granted ids of the widgets correspond to message types id csHash<psMainWidget::mesgOption, int>::GlobalIterator iter = mainWidget->GetMesgOptionsIterator(); @@ -138,7 +154,6 @@ } } - dirty = true; return true; @@ -148,6 +163,7 @@ { magicWindow->showWindow->SetState(!showActiveMagicConfig->GetState()); npcDialog->SetUseBubbles(useNpcDialogBubbles->GetState()); + npcDialog->SetNpcMsgTimeoutScale(npcMsgTimeoutScale->GetCurrentValue()); //we take for granted ids of the widgets correspond to message types id csHash<psMainWidget::mesgOption, int>::GlobalIterator iter = mainWidget->GetMesgOptionsIterator(); Modified: trunk/src/client/gui/pawsconfigpopup.h =================================================================== --- trunk/src/client/gui/pawsconfigpopup.h 2014-10-02 23:17:58 UTC (rev 9588) +++ trunk/src/client/gui/pawsconfigpopup.h 2014-10-03 20:56:53 UTC (rev 9589) @@ -34,6 +34,7 @@ #include "util/psxmlparser.h" class pawsCheckBox; +class pawsScrollBar; class pawsActiveMagicWindow; class pawsNpcDialogWindow; @@ -49,6 +50,7 @@ virtual bool SaveConfig(); ///< @see pawsWidget virtual void SetDefault(); ///< @see pawsWidget +protected: /** Check-box which gives the user a opportunity to show or * not to show the Active Magic Window */ @@ -57,6 +59,9 @@ * not the bubble based npcdialog interface */ pawsCheckBox* useNpcDialogBubbles; + /** Scale slider for setting up the npc delay factor + */ + pawsScrollBar* npcMsgTimeoutScale; protected: pawsActiveMagicWindow* magicWindow; ///< This is used to point to a instance of magic window Modified: trunk/src/client/gui/pawsnpcdialog.cpp =================================================================== --- trunk/src/client/gui/pawsnpcdialog.cpp 2014-10-02 23:17:58 UTC (rev 9588) +++ trunk/src/client/gui/pawsnpcdialog.cpp 2014-10-03 20:56:53 UTC (rev 9589) @@ -48,11 +48,12 @@ closeBubble = NULL; giveBubble = NULL; useBubbles = false; + npcMsgTimeoutScale = 1.0f; + npcMsgTimeoutScaleMax = 5.0f; ticks = 0; cameraMode = 0; loadOnce = 0; questIDFree = -1; - enabledChatBubbles = true; clickedOnResponseBubble = false; gotNewMenu = false; timeDelay = 3000; // initial minimum time of 3 seconds @@ -89,14 +90,54 @@ { //let this dialog invisible for the time calculated to read the NPC say text //if we got a new psDialogMenuMessage we don't need to ask for a new menu (gotNewMenu) - if(useBubbles && ticks != 0 && csGetTicks()-ticks > timeDelay && !gotNewMenu) + if(useBubbles && npcMsgQueue.GetSize() > 0 && ((ticks != 0 && csGetTicks()-ticks > timeDelay) || clickedOnResponseBubble)) { - Debug1(LOG_PAWS,0,"Hiding NPC speech and asking for another set of possible questions."); - speechBubble->Hide(); - FindWidget("FreeBubble")->Show(); - psengine->GetCmdHandler()->Execute("/npcmenu"); - ticks = 0; + // delete first entry (deleting an non existant index is not a problem) + npcMsgQueue.DeleteIndex(0); + + // if there is still something left, just display the next message + if (npcMsgQueue.GetSize() > 0) + { + clickedOnResponseBubble = false; + NpcSays(); + } + // if no new menu was sent by the server, request the default npc menu + // this only works properly after the last message was given by the npc + else if (!gotNewMenu) + { + // if no new menu was sent by the server, request the default npc menu + Debug1(LOG_PAWS,0,"Hiding NPC speech and asking for another set of possible questions."); + speechBubble->Hide(); + FindWidget("FreeBubble")->Show(); + psengine->GetCmdHandler()->Execute("/npcmenu"); + ticks = 0; + displaysNewMenu = false; + } + } + else if (npcMsgQueue.GetSize() == 0 && (csGetTicks()-ticks > timeDelay || clickedOnResponseBubble)) + { + if (gotNewMenu && ! displaysNewMenu) + { + if (useBubbles) + { + speechBubble->Hide(); // hide previous npc say response + AdjustForPromptWindow(); // should be done before DisplayQuestBubbles + DisplayQuestBubbles(displayIndex); + giveBubble->Show(); + } + else + { + AdjustForPromptWindow(); + } + + Show(); + displaysNewMenu = true; + } + } + + SendToBottom(this); + //printf("gotNewMenu: %d, ticks: %d timeDelay: %d\n",gotNewMenu?1:0, (csGetTicks()-ticks), timeDelay); pawsWidget::Draw(); } @@ -506,22 +547,15 @@ responseList->Clear(); SelfPopulateXML(mesg.xml); + + gotNewMenu = true; + displaysNewMenu = false; if(useBubbles) { - speechBubble->Hide(); // hide previous npc say response - LoadQuest(mesg.xml); - AdjustForPromptWindow(); // should be done before DisplayQuestBubbles - DisplayQuestBubbles(displayIndex); - gotNewMenu = true; + LoadQuest(mesg.xml); giveBubble->Show(); } - else - { - AdjustForPromptWindow(); - } - - Show(); } else if(me->GetType() == MSGTYPE_CHAT) { @@ -556,11 +590,22 @@ default: inText = chatMsg.sText; } - NpcSays(inText, actor); + + // text queue empty + bool textQueueEmpty = npcMsgQueue.IsEmpty(); + + if(IsVisible() && actor && psengine->GetCharManager()->GetTarget() == actor) + { + npcMsgQueue.Push(inText); - //checks if the NPC Dialogue is displayed, in this case don't show the normal overhead bubble - if(IsVisible()) - return; + // queue was previously empty, so start talking + if (textQueueEmpty) + { + NpcSays(); + } + + ShowSpeechBubble(); + } } else if(me->GetType() == MSGTYPE_REMOVE_OBJECT) { @@ -577,38 +622,53 @@ } } -void pawsNpcDialogWindow::NpcSays(csString &inText,GEMClientActor* actor) +void pawsNpcDialogWindow::ShowSpeechBubble() { - //this is used only when using the chat bubbles interface + // this is used solely when the chat bubbles interface is active if(!useBubbles) { return; } + + // show speech bubble and hide the rest of the bubbles + speechBubble->Show(); + FindWidget("Bubble1")->Hide(); + FindWidget("Bubble2")->Hide(); + FindWidget("Bubble3")->Hide(); + FindWidget("LeftArrow")->Hide(); + FindWidget("RightArrow")->Hide(); + FindWidget("FreeBubble")->Hide(); + FindWidget("GiveBubble")->Hide(); + Show(); //show the npc dialog +} +void pawsNpcDialogWindow::NpcSays() //csString &inText,GEMClientActor* actor) +{ + // this is used solely when the chat bubbles interface is active + if(!useBubbles) + { + return; + } + if(npcMsgQueue.GetSize() <= 0) + { + return; + } + // load next text + csString text = npcMsgQueue[0]; + // response bubble has not been clicked yet clickedOnResponseBubble = false; //display npc response - if(IsVisible() && actor && psengine->GetCharManager()->GetTarget() == actor) - { - dynamic_cast<pawsMultiLineTextBox*>(speechBubble->FindWidget("BubbleText"))->SetText(inText.GetData()); - speechBubble->Show(); - FindWidget("Bubble1")->Hide(); - FindWidget("Bubble2")->Hide(); - FindWidget("Bubble3")->Hide(); - FindWidget("LeftArrow")->Hide(); - FindWidget("RightArrow")->Hide(); - FindWidget("FreeBubble")->Hide(); - FindWidget("GiveBubble")->Hide(); - - ticks = csGetTicks(); - timeDelay = (csTicks)(2000 + 50*strlen(inText.GetData()) + 2000); // add 2 seconds for network delay - timeDelay = timeDelay>14000?14000:timeDelay; // clamp to 14000 max - - Show(); //show the npc dialog - } + dynamic_cast<pawsMultiLineTextBox*>(speechBubble->FindWidget("BubbleText"))->SetText(text.GetData()); + + // set amount of time the message is displayed + ticks = csGetTicks(); + int itime = 1000 + 50*text.Length() + 1000; + float time = (float)(itime); + time = time * npcMsgTimeoutScale; // 0.5 = round up + timeDelay = (csTicks)(time); } - void pawsNpcDialogWindow::AdjustForPromptWindow() { csString str; @@ -814,7 +874,7 @@ psengine->GetPSCamera()->SetCameraMode(0); //set the camera to the first person mode targetEID = cobj->GetEID(); } - enabledChatBubbles = psengine->GetChatBubbles()->isEnabled(); + //enabledChatBubbles = psengine->GetChatBubbles()->isEnabled(); //psengine->GetChatBubbles()->setEnabled(false); } @@ -891,6 +951,14 @@ //showWindow->SetState(!option->GetAttributeValueAsBool("value")); useBubbles = option->GetAttributeValueAsBool("value"); } + if(nodeName == "npcmessagetimeoutscale") + { + npcMsgTimeoutScale = option->GetAttributeValueAsFloat("value"); + } + if(nodeName == "npcmessagetimeoutscalemax") + { + npcMsgTimeoutScaleMax = option->GetAttributeValueAsFloat("value"); + } } } @@ -907,6 +975,7 @@ csRef<iDocument> doc = docsys->CreateDocument(); csRef<iDocumentNode> root,defaultRoot, npcDialogNode, npcDialogOptionsNode, useNpcDialogNode; + csRef<iDocumentNode> npcMsgTimeoutNode, npcMsgTimeoutMaxNode; root = doc->CreateRoot(); @@ -919,6 +988,14 @@ useNpcDialogNode = npcDialogOptionsNode->CreateNodeBefore(CS_NODE_ELEMENT, 0); useNpcDialogNode->SetValue("usenpcdialog"); useNpcDialogNode->SetAttributeAsInt("value", useBubbles? 1 : 0); + + npcMsgTimeoutNode = npcDialogOptionsNode->CreateNodeBefore(CS_NODE_ELEMENT, 0); + npcMsgTimeoutNode->SetValue("npcmessagetimeoutscale"); + npcMsgTimeoutNode->SetAttributeAsFloat("value", npcMsgTimeoutScale); + + npcMsgTimeoutMaxNode = npcDialogOptionsNode->CreateNodeBefore(CS_NODE_ELEMENT, 0); + npcMsgTimeoutMaxNode->SetValue("npcmessagetimeoutscalemax"); + npcMsgTimeoutMaxNode->SetAttributeAsInt("value", npcMsgTimeoutScaleMax); doc->Write(file); } Modified: trunk/src/client/gui/pawsnpcdialog.h =================================================================== --- trunk/src/client/gui/pawsnpcdialog.h 2014-10-02 23:17:58 UTC (rev 9588) +++ trunk/src/client/gui/pawsnpcdialog.h 2014-10-03 20:56:53 UTC (rev 9589) @@ -113,12 +113,17 @@ void DisplayQuestBubbles(unsigned int index); /** + * @brief Shows the npc chat window and hides the menu bubbles. + */ + void ShowSpeechBubble(); + + /** * @brief Display NPC's chat text * * @param inText Content that the NPC's chat text * @param actor The target NPC name */ - void NpcSays(csString& inText, GEMClientActor *actor); + void NpcSays();//csString& inText, GEMClientActor *actor); /** * Handles timing to make bubbles disappear in the bubbles npc dialog mode. @@ -150,8 +155,47 @@ { useBubbles = useBubblesNew; } + /** + * Getter for npc messsage timeout. + * The timeout determines how long a npc message is displayed. + * Apparently this is just a scaling factor for shortening or + * prolonging the display. + */ + float GetNpcMsgTimeoutScale() + { + return npcMsgTimeoutScale; + } + /** + * Setter for npc messsage timeout. + * The timeout determines how long a npc message is displayed. + * Apparently this is just a scaling factor for shortening or + * prolonging the display. + * @param timeoutScale is multiplied with the real factor. + */ + void SetNpcMsgTimeoutScale(float timeoutScale) + { + if (timeoutScale < 0) + { + npcMsgTimeoutScale = 0.0; + } else if (timeoutScale > npcMsgTimeoutScaleMax) + { + npcMsgTimeoutScale = npcMsgTimeoutScaleMax; + } else + { + npcMsgTimeoutScale = timeoutScale; + } + } + /** + * Getter for npc messsage timeout. + * The maximum timeout determines how long a npc message is + * displayed at maximum. + * @returns maximum scaling factor + */ + float GetNpcMsgTimeoutScaleMax() + { + return npcMsgTimeoutScaleMax; + } - /** * Saves the setting of the menu used for later use */ @@ -170,27 +214,33 @@ * Handles the display of player text in chat */ void DisplayTextInChat(const char *sayWhat); + + // values are loaded from configuration files + bool useBubbles; ///< Stores which modality should be used for the npcdialog (bubbles/menus) + float npcMsgTimeoutScale; ///< stores how long an npc message is displayed (scaling factor only!) + float npcMsgTimeoutScaleMax; ///< stores the maximum time for how long an npc message is displayed (scaling factor only!) - bool useBubbles; ///< Stores which modality should be used for the npcdialog (bubbles/menus) + // variables used to display npc dialogs + csArray<QuestInfo> questInfo; ///< Stores all the quest info and triggers parsed from xml binding. + unsigned int displayIndex; ///< Index to display which quests + int cameraMode; ///< Stores the camera mode + int loadOnce; ///< Stores if bubbles has been loaded + bool clickedOnResponseBubble; ///< flag when player clicks on the response bubble + int questIDFree; ///< Keeps the value of the quest if the free text question was triggered. + bool gotNewMenu; ///< keeps track of the incoming new menu message + bool displaysNewMenu; ///< set to true when displaying a new menu + csTicks timeDelay; ///< stores the calculated time needed to read the last npc say (in ticks). + csTicks ticks; ///< point in time when displaying a message started - csArray<QuestInfo> questInfo; ///< Stores all the quest info and triggers parsed from xml binding. - unsigned int displayIndex; ///< Index to display which quests - int cameraMode; ///< Stores the camera mode - int loadOnce; ///< Stores if bubbles has been loaded - bool enabledChatBubbles; ///< Stores the state of chat bubbles. - bool clickedOnResponseBubble; ///< flag when player clicks on the response bubble - bool gotNewMenu; ///< keeps track of the incoming new menu message - csTicks timeDelay; ///< calculates the time needed to read the last npc say - int questIDFree; ///< Keeps the value of the quest if the free text question was triggered. - pawsListBox* responseList; pawsWidget* speechBubble; pawsEditTextBox* textBox; pawsButton* closeBubble; pawsButton* giveBubble; - csTicks ticks; - EID targetEID; ///< The eid of the current target used to hide the dialog if the actor is removed. + EID targetEID; ///< The eid of the current target used to hide the dialog if the actor is removed. + + csArray<csString> npcMsgQueue; ///< list of text messages from a npc (sort of queue). }; Modified: trunk/src/server/bulkobjects/dictionary.cpp =================================================================== --- trunk/src/server/bulkobjects/dictionary.cpp 2014-10-02 23:17:58 UTC (rev 9588) +++ trunk/src/server/bulkobjects/dictionary.cpp 2014-10-03 20:56:53 UTC (rev 9589) @@ -98,8 +98,18 @@ while(responsesIter.HasNext()) delete responsesIter.Next(); csHash<NpcDialogMenu*, csString>::GlobalIterator menuIter(initial_popup_menus.GetIterator()); - while(menuIter.HasNext()) + while(menuIter.HasNext()) delete menuIter.Next(); + Debug2(LOG_QUESTS, 0, "remaning popupmenus by questid: %u", (unsigned int) initial_popup_menus_by_quest_id.GetSize()); + initial_popup_menus_by_quest_id.DeleteAll(-1); + Debug2(LOG_QUESTS, 0, "remaning popupmenus by questid: %u", (unsigned int) initial_popup_menus_by_quest_id.GetSize()); + csHash<NpcDialogMenu*>::GlobalIterator debugIt = initial_popup_menus_by_quest_id.GetIterator(); + while (debugIt.HasNext()) + { + csTuple2<NpcDialogMenu*, int> tup = debugIt.NextTuple(); + Debug2(LOG_QUESTS, 0, "remaning popupmenu with questid %d", tup.second); + } + wnclose(); dict = NULL; } @@ -750,7 +760,7 @@ newresp->type = NpcResponse::VALID_RESPONSE; newresp->quest = quest; - if(quest && quest->GetPrerequisite()) + if(quest && quest->GetPrerequisite().IsValid()) { newresp->prerequisite = quest->GetPrerequisite()->Copy(); } @@ -788,19 +798,35 @@ return newresp; } -void NPCDialogDict::DeleteTriggerResponse(NpcTrigger* trigger, int responseId) -{ - csHash<NpcResponse*>::Iterator iter(responses.GetIterator(responseId)); - while(iter.HasNext()) - delete iter.Next(); - responses.DeleteAll(responseId); +void NPCDialogDict::DeleteTriggerResponse(NpcTrigger* trigger, int responseID) +{ + if (responses.IsEmpty()) + return; + + csHash<NpcResponse*>::Iterator iter(responses.GetIterator(responseID)); + + while (iter.HasNext()) + { + NpcResponse* response = iter.Next(); + + if (! responses.Delete(responseID, response)) + { + Error2("given trigger was not found with response id: %d\n", response->id); + } + else + { + delete response; + } + } + // remove the response from the trigger and if the trigger is empty the trigger if(trigger) { - trigger->responseIDlist.Delete(responseId); + trigger->responseIDlist.Delete(responseID); if(trigger->responseIDlist.GetSize() == 0) { triggers.Delete(trigger); + trigger_by_id.Delete(trigger->id,trigger); delete trigger; } } @@ -876,7 +902,16 @@ void NPCDialogDict::AddMenu(const char* name, NpcDialogMenu* menu) { + psQuest* quest = NULL; NpcDialogMenu* found = FindMenu(name); + NpcDialogMenu* found_by_quest = NULL; + bool menu_was_found = false; + + if (menu->triggers.GetSize() > 0) + { + quest = menu->triggers[0].quest; + } + if(found) // merge with existing { found->Add(menu); @@ -885,10 +920,53 @@ else // add a new menu { initial_popup_menus.PutUnique(csString(name),menu); + found = menu; } + + // no questid to be found (should only happen on initial menu creation) + // TODO: fix *remove* the initial menu creation - it's useless + if (! quest) + return; + + csHash<NpcDialogMenu*>::Iterator it = initial_popup_menus_by_quest_id.GetIterator(quest->GetID()); + while(it.HasNext()) + { + found_by_quest = it.Next(); + if (found_by_quest == found) + { + menu_was_found = true; + break; + } + } + if (!menu_was_found) + { + initial_popup_menus_by_quest_id.Put(quest->GetID(), found); + } } +void NPCDialogDict::AddMenu(NpcDialogMenu* menu) +{ + int questID = -1; + if (menu->triggers.GetSize() > 0 && menu->triggers[0].quest) + { + questID = menu->triggers[0].quest->GetID(); + } + initial_popup_menus_by_quest_id.Put(questID, menu); +} +void NPCDialogDict::DeleteMenusForQuest(psQuest* quest) +{ + // get the menus of the supplied quest + csHash<NpcDialogMenu*>::Iterator it = initial_popup_menus_by_quest_id.GetIterator(quest->GetID()); + NpcDialogMenu* help; + + while(it.HasNext()) + { + help = it.Next(); + help->DeleteAllMenusOfQuest(quest); + } +} + void PrintTrigger(NpcTrigger* trig) { CPrintf(CON_CMDOUTPUT ,"Trigger [%d] %s : \"%-60.60s\" %8d /", @@ -1219,7 +1297,9 @@ NpcResponse::~NpcResponse() { - delete menu; + // remove all traces of this response + if (menu && quest) + menu->DeleteAllMenusOfQuest(quest); } bool NpcResponse::Load(iResultRow &row) @@ -1575,7 +1655,7 @@ { // Make sure that the first op is an AND list if there are an // prerequisite from before. - if(prerequisite) + if(prerequisite.IsValid()) { // Check if first op is an and list. psQuestPrereqOp* cast = prerequisite; @@ -1585,7 +1665,8 @@ // If not insert an and list. list.AttachNew(new psQuestPrereqOpAnd()); list->Push(prerequisite); - prerequisite = list; + // correct way, otherwise ref counter is invalid + prerequisite.AttachNew(list); } if(insertBeginning) @@ -1731,6 +1812,7 @@ bool SayResponseOp::Run(gemNPC* who, gemActor* target,NpcResponse* owner,csTicks &timeDelay, int &voiceNumber) { + csTicks zeroTicks = 1; psString response; if(sayWhat) @@ -1747,7 +1829,7 @@ if(target->GetSecurityLevel() >= GM_DEVELOPER) response.AppendFmt(" (%s)",owner->triggerText.GetDataSafe()); - who->Say(response,target->GetClient(), saypublic && target->GetVisibility(),timeDelay); + who->Say(response,target->GetClient(), saypublic && target->GetVisibility(),zeroTicks); return true; } @@ -1776,6 +1858,8 @@ bool ActionResponseOp::Run(gemNPC* who, gemActor* target,NpcResponse* owner,csTicks &timeDelay, int &voiceNumber) { + csTicks zeroTicks = 1; + if(!anim.IsEmpty()) who->SetAction(anim,timeDelay); @@ -1783,7 +1867,7 @@ { csString response(*actWhat); who->GetNPCDialogPtr()->SubstituteKeywords(target->GetClient(),response); - who->ActionCommand(actionMy, actionNarrate, response.GetDataSafe(), target->GetClient(), IsPublic() && target->GetVisibility(), timeDelay); + who->ActionCommand(actionMy, actionNarrate, response.GetDataSafe(), target->GetClient(), IsPublic() && target->GetVisibility(), zeroTicks); } return true; @@ -2776,7 +2860,6 @@ NpcDialogMenu::NpcDialogMenu() { - counter = 0; } void NpcDialogMenu::AddTrigger(const csString &menuText, const csString &trigger, psQuest* quest, psQuestPrereqOp* script) @@ -2787,8 +2870,8 @@ new_trigger.trigger = trigger; new_trigger.quest = quest; new_trigger.prerequisite = script; - new_trigger.triggerID = counter++; - + new_trigger.triggerID = triggers.GetSize() + 1; + this->triggers.Push(new_trigger); } @@ -2805,6 +2888,19 @@ //printf("Added %lu triggers to menu.\n", (unsigned long) add->triggers.GetSize()); } +void NpcDialogMenu::DeleteAllMenusOfQuest(psQuest* quest) +{ + for (size_t i=0; i<triggers.GetSize(); i++) + { + if (triggers[i].quest == quest) + { + triggers.DeleteIndex(i); + //i=0; // start over at the very start of the array + i--; + } + } +} + void NpcDialogMenu::ShowMenu(Client* client,csTicks delay, gemNPC* npc) { if(client == NULL) @@ -2813,57 +2909,48 @@ psDialogMenuMessage menu; csString currentQuest; - int count = 0; + size_t count = 0; bool IsTesting = client->GetCharacterData()->GetActor()->questtester; bool IsGm = client->IsGM(); - for(size_t i=0; i < counter; i++) + for(count=0; count < triggers.GetSize(); count++) { csString prereq; - if(triggers[i].quest && !triggers[i].quest->Active() && !IsTesting) + // fetch the prerequisites + if(triggers[count].quest && !triggers[count].quest->Active() && !IsTesting) continue; - if(triggers[i].prerequisite) + if(triggers[count].prerequisite) { - prereq = triggers[i].prerequisite->GetScript(); + prereq = triggers[count].prerequisite->GetScript(); } - //if (!prereq.IsEmpty()) - //{ - // printf("Item %lu Prereq : %s\n", (unsigned long) i, prereq.GetDataSafe()); - //} - //else - //{ - // printf("Item %lu has no prereqs.\n", (unsigned long) i); - //} - - if(triggers[i].prerequisite && !IsTesting) + if(triggers[count].prerequisite && !IsTesting) { - if(!triggers[i].prerequisite->Check(client->GetCharacterData())) + if(!triggers[count].prerequisite->Check(client->GetCharacterData())) { - //printf("Prereq check failed. Skipping.\n"); continue; } } //check availability (as per lockout). Note as gm we show quest even if in lockout as > gm get //an error message in system even if they can't get it because testermode is off - if(triggers[i].quest && !IsGm && !IsTesting && !client->GetCharacterData()->GetQuestMgr().CheckQuestAvailable(triggers[i].quest, npc->GetPID())) + if(triggers[count].quest && !IsGm && !IsTesting && !client->GetCharacterData()->GetQuestMgr().CheckQuestAvailable(triggers[count].quest, npc->GetPID())) continue; // Check to see about inserting a quest heading - if(!(currentQuest == (triggers[i].quest ? triggers[i].quest->GetName() : "(Unknown)"))) + if(!(currentQuest == (triggers[count].GetQuestTitle()))) { - currentQuest = triggers[i].quest ? triggers[i].quest->GetName() : "(Unknown)"; + currentQuest = triggers[count].GetQuestTitle(); csString temp = "h:", temptrig = "heading"; temp += currentQuest; - menu.AddResponse((uint32_t) i, temp, temptrig); + menu.AddResponse((uint32_t) count, temp, temptrig); } - csString menuText = triggers[i].menuText; + csString menuText = triggers[count].menuText; npc->GetNPCDialogPtr()->SubstituteKeywords(client,menuText); // Only add the trigger if it isn't a question, also add the @@ -2871,18 +2958,18 @@ csString trigger; // It's a quest - if(triggers[i].quest) + if(triggers[count].quest) { // As the trigger is unused client side, being a question, // use it to store the questID. if(menuText.Find("?=") != SIZET_NOT_FOUND) { - trigger.Format("{%d}", triggers[i].quest->GetID()); + trigger.Format("{%d}", triggers[count].quest->GetID()); } - else if(triggers[i].trigger.GetAt(0) != '<') + else if(triggers[count].trigger.GetAt(0) != '<') { // This is a normal trigger add {d} in front of it with the questID - trigger.Format("{%d} %s", triggers[i].quest->GetID(), triggers[i].trigger.GetData()); + trigger.Format("{%d} %s", triggers[count].quest->GetID(), triggers[count].trigger.GetData()); } else { @@ -2890,8 +2977,8 @@ // Simple replacement to add the needed tag: reasoning, there can be only one </l> // in the xml so this <l money="0,0,0,0"><item n="Steel Falchion" c="1"/></l> // is made this: <l money="0,0,0,0"><item n="Steel Falchion" c="1"/><questid id="1234"/></l> - trigger = triggers[i].trigger; - trigger.FindReplace("</l>", csString().Format("<questid id=\"%d\"/></l>", triggers[i].quest->GetID())); + trigger = triggers[count].trigger; + trigger.FindReplace("</l>", csString().Format("<questid id=\"%d\"/></l>", triggers[count].quest->GetID())); } } else //not part of a quest @@ -2902,14 +2989,13 @@ } else { - trigger = triggers[i].trigger; + trigger = triggers[count].trigger; } } - menu.AddResponse((uint32_t) i, + menu.AddResponse((uint32_t) count, menuText, trigger); - count++; } if(count) @@ -2923,7 +3009,7 @@ } } -void NpcDialogMenu::SetPrerequisiteScript(psQuestPrereqOp* script) +void NpcDialogMenu::SetPrerequisiteScript(csRef<psQuestPrereqOp> script) { csString prereq; @@ -2937,8 +3023,32 @@ // Each item must have its own prequisite script so they can be different when menus are merged // even though they appear to all be set the same here. - for(size_t i=0; i < counter; i++) + for(size_t i=0; i < triggers.GetSize(); i++) { triggers[i].prerequisite = script; } } + +void NpcDialogMenu::InitializeQuestTitles() +{ + csString questTitle; + csString questof; + for (size_t i=0; i < triggers.GetSize(); i++) + { + // only if questname is available, create <questname (1/x)> titles + if (triggers[i].quest && triggers[i].quest->GetName()) + { + questof.Format(" (%u of %u)", (int) i+1, (int) triggers.GetSize()); + triggers[i].questTitle = triggers[i].quest->GetName() + questof; + } + } +} + +csString NpcDialogMenu::DialogTrigger::GetQuestTitle() +{ + if (questTitle.IsEmpty()) + { + return quest ? quest->GetName() : "(Unknown)"; + } + return questTitle; +} Modified: trunk/src/server/bulkobjects/dictionary.h =================================================================== --- trunk/src/server/bulkobjects/dictionary.h 2014-10-02 23:17:58 UTC (rev 9588) +++ trunk/src/server/bulkobjects/dictionary.h 2014-10-03 20:56:53 UTC (rev 9589) @@ -23,6 +23,7 @@ // Crystal Space Includes //============================================================================= #include <csutil/csstring.h> +//#include <csutil/ref.h> #include <csutil/refcount.h> #include <csutil/parray.h> #include <csutil/hash.h> @@ -85,6 +86,7 @@ /// This is a storage area for popup menus parsed during quest loading, which is done before NPCs are spawned. csHash<NpcDialogMenu*,csString> initial_popup_menus; + csHash<NpcDialogMenu*> initial_popup_menus_by_quest_id; int dynamic_id; @@ -161,13 +163,31 @@ int prior_response, int trigger_response); - void DeleteTriggerResponse(NpcTrigger* trigger, int responseId); + void DeleteTriggerResponse(NpcTrigger* trigger, int responseID); /// Find a stored initial trigger menu with the specified NPC name NpcDialogMenu* FindMenu(const char* name); /// Store an initial trigger menu with the specified NPC name void AddMenu(const char* name, NpcDialogMenu* menu); + + /** Store a menu with the dictionary + * NOTE: this is hacky - natoka + * @param menu to register - it will get cleaned up on dict destruction + */ + void AddMenu(NpcDialogMenu* menu); + + /** + * Remove the quest related NpcDialogMenu entries. + * + * Will remove the DialogTrigger entries (as storde in triggers) + * of all NpcDialogMenu objects that have been registered in + * this dictionary. + * @param quest pointer to delete the menus for. + */ + void DeleteMenusForQuest(psQuest* quest); + + void RemoveEmptyMenu(NpcDialogMenu* menu); /** * Dump the entire dictionary @@ -259,7 +279,7 @@ /// Load the trigger from a database bool Load(iResultRow &row); - /// Return true if there are one available response for this trigger + /// Return true if there is one response available for this trigger bool HaveAvailableResponses(Client* client, gemNPC* npc, NPCDialogDict* dict, csArray<int>* availableResponseList = NULL, int questID = -1); /// Return one of the members of responseIDlist array randomly @@ -286,6 +306,9 @@ virtual bool Load(iDocumentNode* node) = 0; virtual csString GetResponseScript() = 0; virtual bool Run(gemNPC* who, gemActor* target,NpcResponse* owner,csTicks &timeDelay, int &voiceNumber) = 0; + /** + * only used for output in error messages while parsing the script in NpcResponse + */ const char* GetName() { return name; @@ -304,25 +327,72 @@ protected: struct DialogTrigger { - unsigned int triggerID; - csString menuText; - csString trigger; - psQuest* quest; - csRef<psQuestPrereqOp> prerequisite; + unsigned int triggerID; ///< internal trigger identifier + csString questTitle; ///< title - with numbers (1 of ...) + csString menuText; ///< text of the menu entry + csString trigger; ///< actual trigger text + psQuest* quest; ///< quest that the trigger refers to + csRef<psQuestPrereqOp> prerequisite; + + /** + * retrive the title of the specified trigger. + * A set questTitle takes preceedence over fetching + * the questtitle automatically from the given quest + */ + csString GetQuestTitle(); + DialogTrigger() : quest(NULL) {} }; - unsigned int counter; // ID counter - public: - csArray<DialogTrigger> triggers; + csArray<DialogTrigger> triggers; ///< list of menu items + /** + * Default construtor + */ NpcDialogMenu(); + /** + * Adds a trigger to the menu. + * + * @param menuText is the text to display in the menu + * @param trigger is the text that the player needs to enter to trigger the menu entry + * @param quest that the trigger refers to + * @param script are the quest prerequisites for ??? + */ void AddTrigger(const csString &menuText, const csString &trigger, psQuest* quest, psQuestPrereqOp* script=NULL); + /** + * Adds a the triggers of the NpcDialogMenu to the array of triggers. + * + * @param add contains the triggers to add. + */ void Add(NpcDialogMenu* add); + /** + * Remove the specified quest's menus + * + * @param quest pointer to the quest to remove + */ + void DeleteAllMenusOfQuest(psQuest* quest); + /** + * display the menu on the client. + * @param client to display the menu on + * @param npc is the npc the dialog is conducted with + */ void ShowMenu(Client* client,csTicks delay, gemNPC* npc); - void SetPrerequisiteScript(psQuestPrereqOp* script); + /** + * sets the prerequisite script for all DialogTriggers. + * The complete triggers array is iterated through and all + * structs have the prerequisite set to the script. + * @param script the prerequisites that are to be set. + */ + void SetPrerequisiteScript(csRef<psQuestPrereqOp> script); + + /** + * Initializes the Questtitles of the array. + * Should only be used when storing triggers for one quest, + * otherwise counting the triggers will + */ + void InitializeQuestTitles(); }; /** @@ -390,7 +460,7 @@ csString GetResponseScript(); // This is used so that the popup menu and the subsequent response can share the same filtering criteria - psQuestPrereqOp* GetPrerequisiteScript() + csRef<psQuestPrereqOp> GetPrerequisiteScript() { return prerequisite; } Modified: trunk/src/server/bulkobjects/psquest.cpp =================================================================== --- trunk/src/server/bulkobjects/psquest.cpp 2014-10-02 23:17:58 UTC (rev 9588) +++ trunk/src/server/bulkobjects/psquest.cpp 2014-10-03 20:56:53 UTC (rev 9589) @@ -43,9 +43,8 @@ #include "dictionary.h" -psQuest::psQuest() : task("") -{ - id = 0; +psQuest::psQuest(int id, const char* name) : id(id), name(name) +{ parent_quest = NULL; image.Clear(); step_id = 0; @@ -61,19 +60,15 @@ { prerequisite = NULL; + // release all *registered* triggers for(size_t i = 0; i < triggerPairs.GetSize(); i++) { TriggerResponse triggerResponse = triggerPairs.Get(i); dict->DeleteTriggerResponse(triggerResponse.trigger, triggerResponse.responseID); } + dict->DeleteMenusForQuest(this); } -void psQuest::Init(int new_id, const char* new_name) -{ - id = new_id; - name = new_name; -} - bool psQuest::Load(iResultRow &row) { id = row.GetInt("id"); @@ -666,11 +661,11 @@ return true; } -void psQuest::AddTriggerResponse(NpcTrigger* trigger, int responseID) +void psQuest::AddTriggerResponse(NpcTrigger* trigger, NpcResponse* response) { TriggerResponse triggerPair; - triggerPair.responseID = responseID; - triggerPair.trigger = trigger; + triggerPair.responseID = response->id; + triggerPair.trigger = trigger; triggerPairs.Push(triggerPair); } Modified: trunk/src/server/bulkobjects/psquest.h =================================================================== --- trunk/src/server/bulkobjects/psquest.h 2014-10-02 23:17:58 UTC (rev 9588) +++ trunk/src/server/bulkobjects/psquest.h 2014-10-03 20:56:53 UTC (rev 9589) @@ -45,7 +45,9 @@ class psQuestPrereqOp; class psCharacter; +class NpcResponse; class NpcTrigger; +class NpcDialogMenu; class psQuest; /** @@ -64,17 +66,38 @@ class psQuest : public CS::Utility::WeakReferenced { public: - psQuest(); + /** + * default constructor + * + * @param id questID - either from the database, or dynamically created + * @param name is a unique string + */ + psQuest(int id = 0, const char* name = ""); virtual ~psQuest(); + /** + * loads the quest information from a supplied result set + * @param row result set to store in this object + */ bool Load(iResultRow &row); + /** + * parses the prerequisite string and caches the result + */ bool PostLoad(); - void Init(int id, const char* name); - + + /** + * The id can be defined by the database or dynamically created. + * + * Dynamic creation takes place in CacheManager::AddDynamicQuest + * @return the quest's id + */ int GetID() const { return id; } + /** + * @return the quest's name + */ const char* GetName() const { return name; @@ -136,7 +159,31 @@ // csString QuestToXML() const; bool AddPrerequisite(csString prerequisitescript); bool AddPrerequisite(csRef<psQuestPrereqOp> op); - void AddTriggerResponse(NpcTrigger* trigger, int responseID); + + /** + * Adds a set of pointers to a trigger and a response. + * + * This is needed for deallocation at desctruction time. + * @param trigger created by the quests questscript + * @param response created by the quests questscript + */ + void AddTriggerResponse(NpcTrigger* trigger, NpcResponse* response); + /** + * Adds a pointer to a menu. + * + * This is needed for deallocation at desctruction time. + * @param menu created by the quests questscript + */ + //void AddMenu(NpcDialogMenu* menu); + + //csArray<NpcDialogMenu*> &GetMenuList(); + + /** + * Register a quest as a subquest of this quest. + * + * Subquests are normally generated when parsing quest_scripts. + * @param id of the subquest to register. + */ void AddSubQuest(int id) { subquests.Push(id); @@ -145,7 +192,7 @@ /** * Returns an ordered list of the subquests of this quest (so it's steps). * - * @return A reference to an array containing the id of the subquests. + * @return A reference to an array containing the id of each subquests. */ csArray<int> &GetSubQuests() { @@ -157,7 +204,7 @@ * * @return The prerequisite for this quest. */ - psQuestPrereqOp* GetPrerequisite() + csRef<psQuestPrereqOp>& GetPrerequisite() { return prerequisite; } @@ -189,13 +236,13 @@ } protected: - int id; - csString name; - csString task; + int id; ///< quest id - either as stored in the database or as assigned by CacheManager::AddDynamicQuest + csString name; ///< unique quest name + csString task; csString image; int flags; - psQuest* parent_quest; - int step_id; + psQuest* parent_quest; ///< parent quest of this quest (or NULL if there is none) + int step_id; ///< natoka: never used, though i suppose it was ment for the substep number csRef<psQuestPrereqOp> prerequisite; csString category; csString prerequisiteStr; @@ -211,8 +258,9 @@ int responseID; }; - csArray<TriggerResponse> triggerPairs; - csArray<int> subquests; + // this stuff is needed for cleanup when destroying the object + csArray<TriggerResponse> triggerPairs; ///< list of trigger-response pairs added for the quest + csArray<int> subquests; ///< list of IDs of the subquests of this quest bool active; }; Modified: trunk/src/server/bulkobjects/psquestprereqops.cpp =================================================================== --- trunk/src/server/bulkobjects/psquestprereqops.cpp 2014-10-02 23:17:58 UTC (rev 9588) +++ trunk/src/server/bulkobjects/psquestprereqops.cpp 2014-10-03 20:56:53 UTC (rev 9589) @@ -234,34 +234,58 @@ psQuestPrereqOpQuestCompleted::psQuestPrereqOpQuestCompleted(csString questName) { - quest = NULL; + quest = psserver->GetCacheManager()->GetQuestByName(name); name = questName; } bool psQuestPrereqOpQuestCompleted::Check(psCharacter* character) { - if(quest == NULL) - quest = psserver->GetCacheManager()->GetQuestByName(name); + if (! GetQuest()) + { + return false; + } return character->GetQuestMgr().CheckQuestCompleted(quest); } csString psQuestPrereqOpQuestCompleted::GetScriptOp() { csString script; + + script.AppendFmt("<completed quest=\"%s\"/>",GetQuestName().GetData()); - script.AppendFmt("<completed quest=\"%s\"/>",quest->GetName()); - return script; } +psQuest* psQuestPrereqOpQuestCompleted::GetQuest() +{ + if (! quest.IsValid()) + { + quest = psserver->GetCacheManager()->GetQuestByName(name.GetData()); + } + return quest; +} + +csString psQuestPrereqOpQuestCompleted::GetQuestName() +{ + GetQuest(); + if (! quest.IsValid()) + { + return ""; + } + name = quest->GetName(); + + return name; +} + csPtr<psQuestPrereqOp> psQuestPrereqOpQuestCompleted::Copy() { csRef<psQuestPrereqOpQuestCompleted> copy; - if(quest==NULL) - copy.AttachNew(new psQuestPrereqOpQuestCompleted(name)); - else - copy.AttachNew(new psQuestPrereqOpQuestCompleted(quest)); + if(GetQuest()) + { + copy.AttachNew(new psQuestPrereqOpQuestCompleted(GetQuest())); + } + return csPtr<psQuestPrereqOp>(copy); } @@ -269,6 +293,10 @@ bool psQuestPrereqOpQuestAssigned::Check(psCharacter* character) { + if (! GetQuest()) + { + return false; + } return character->GetQuestMgr().CheckQuestAssigned(quest); } @@ -276,7 +304,7 @@ { csString script; - script.AppendFmt("<assigned quest=\"%s\"/>",quest->GetName()); + script.AppendFmt("<assigned quest=\"%s\"/>",GetQuestName().GetData()); return script; } @@ -284,10 +312,35 @@ csPtr<psQuestPrereqOp> psQuestPrereqOpQuestAssigned::Copy() { csRef<psQuestPrereqOpQuestAssigned> copy; - copy.AttachNew(new psQuestPrereqOpQuestAssigned(quest)); + + if (GetQuest()) + { + copy.AttachNew(new psQuestPrereqOpQuestAssigned(GetQuest())); + } return csPtr<psQuestPrereqOp>(copy); } +psQuest* psQuestPrereqOpQuestAssigned::GetQuest() +{ + if (! quest.IsValid()) + { + quest = psserver->GetCacheManager()->GetQuestByName(questName.GetData()); + } + return quest; +} + +csString psQuestPrereqOpQuestAssigned::GetQuestName() +{ + GetQuest(); + if (! quest.IsValid()) + { + return ""; + } + questName = quest->GetName(); + + return questName; +} + /////////////////////////////////////////////////////////////////////////////////////////// bool psQuestPrereqOpQuestCompletedCategory::Check(psCharacter* character) Modified: trunk/src/server/bulkobjects/psquestprereqops.h =================================================================== --- trunk/src/server/bulkobjects/psquestprereqops.h 2014-10-02 23:17:58 UTC (rev 9588) +++ trunk/src/server/bulkobjects/psquestprereqops.h 2014-10-03 20:56:53 UTC (rev 9589) @@ -359,7 +359,7 @@ /** * The quest that need to be completed. */ - psQuest* quest; + csWeakRef<psQuest> quest; csString name; public: @@ -369,7 +369,7 @@ * * @param quest The quest that need to be completed */ - psQuestPrereqOpQuestCompleted(psQuest* quest):quest(quest) {}; + psQuestPrereqOpQuestCompleted(psQuest* quest):quest(quest) { GetQuestName(); }; /** * Construct a quest completed operator @@ -412,6 +412,22 @@ * @return Copy of the prerequisite operator. */ virtual csPtr<psQuestPrereqOp> Copy(); + + /** + * retrieve the quest. + * + * check the weak pointer reference, and if it's invalid try to + * retrieve the quest again. + */ + virtual psQuest* GetQuest(); + + /** + * retrieve the quest name. + * + * check weak pointer reference and try to optain a new ref, if + * it's invalid. Otherwise name is used + */ + virtual csString GetQuestName(); }; /** @@ -426,7 +442,8 @@ /** * The quest that need to be assigned. */ - psQuest* quest; + csWeakRef<psQuest> quest; + csString questName; /// name of the quest (for weakref if invalid) public: /** @@ -434,7 +451,7 @@ * * @param quest The quest that need to be assigned. */ - psQuestPrereqOpQuestAssigned(psQuest* quest):quest(quest) {}; + psQuestPrereqOpQuestAssigned(psQuest* quest):quest(quest) { GetQuestName(); }; /** */ @@ -469,6 +486,22 @@ * @return Copy of the prerequisite operator. */ virtual csPtr<psQuestPrereqOp> Copy(); + + /** + * retrieve the quest. + * + * check the weak pointer reference, and if it's invalid try to + * retrieve the quest again. + */ + virtual psQuest* GetQuest(); + + /** + * retrieve the quest name. + * + * check weak pointer reference and try to optain a new ref, if + * it's invalid. Otherwise name is used + */ + virtual csString GetQuestName(); }; /** Modified: trunk/src/server/cachemanager.cpp =================================================================== --- trunk/src/server/cachemanager.cpp 2014-10-02 23:17:58 UTC (rev 9588) +++ trunk/src/server/cachemanager.cpp 2014-10-03 20:56:53 UTC (rev 9589) @@ -1192,6 +1192,13 @@ psQuest* quest = quests_by_id.Get(id, NULL); if(quest) { + csArray<int> subquestids = quest->GetSubQuests(); + // (potentially) release all subquests + for(size_t i = 0; i < subquestids.GetSize(); i++) + { + UnloadQuest(subquestids[i]); + } + delete quest; quests_by_id.DeleteAll(id); ret = true; @@ -2615,8 +2622,7 @@ // subquests need a fixed id to be loaded at next restart // quest_id*10000+sub_id int id = 10000+(parentQuest->GetID()*100)+step; - ptr = new psQuest; - ptr->Init(id,name); + ptr = new psQuest(id,name); ptr->SetParentQuest(parentQuest); parentQuest->AddSubQuest(id); quests_by_id.Put(id, ptr); @@ -3516,7 +3522,7 @@ Error2("Script Data was:\n%s\n", result[i]["event_script"]); return false; } - scripts.Put(s->Name(), s); + scripts.Put(s->GetName(), s); } } return true; Modified: trunk/src/server/gem.cpp =================================================================== --- trunk/src/server/gem.cpp 2014-10-02 23:17:58 UTC (rev 9588) +++ trunk/src/server/gem.cpp 2014-10-03 20:56:53 UTC (rev 9589) @@ -5115,6 +5115,12 @@ // subsequent ones add to the current time delay, and send delayed if(timeDelay==0) timeDelay = (csTicks)(1000); + else if (timeDelay == (csTicks)1) + { + // TODO: this is hacky + psserver->GetNetManager()->SendMessage(newMsg.msg); + return; + } psserver->GetEventManager()->SendMessageDelayed(newMsg.msg,timeDelay); timeDelay += (csTicks)(2000 + 50*strlen(sayText)); @@ -5158,6 +5164,12 @@ // subsequent ones add to the current time delay, and send delayed if(timeDelay==0) timeDelay = (csTicks)(1000); + else if (timeDelay == (csTicks)1) + { + // TODO: this is hacky + psserver->GetNetManager()->SendMessage(msg.msg); + return; + } psserver->GetEventManager()->SendMessageDelayed(msg.msg,timeDelay); timeDelay += (csTicks)(1000 + 30*strlen(actText)); Modified: trunk/src/server/questmanager.cpp =================================================================== --- trunk/src/server/questmanager.cpp 2014-10-02 23:17:58 UTC (rev 9588) +++ trunk/src/server/questmanager.cpp 2014-10-03 20:56:53 UTC (rev 9589) @@ -937,16 +937,25 @@ int QuestManager::ParseQuestScript(int quest_id, const char* script) { + // content that is related - struct is defined here to make their relation obvious + struct responseset { + int response_id; + NpcResponse* response; + NpcDialogMenu *menu; + + responseset(int id, NpcResponse* resp, NpcDialogMenu* menu) : response_id(id), response(resp), menu(menu) {} + }; + responseset latest(-1, NULL, NULL); // the latest (current) response_id, response, menu + psString scr(script); size_t start = 0; csString line,block; csStringArray pending_triggers; - int last_response_id=-1,next_to_last_response_id=-1; + int prior_response_id=-1; // predeceeding response id size_t which_trigger=0; int step_count=1; // Main quest is step 1 csString current_npc; csString response_text,file_path; - NpcResponse* last_response=NULL; bool quest_assigned_already = false; csString response_requireop; // Accumulate prerequisites for next response csString substep_requireop; // Accumulate prerequisites for current substep @@ -954,7 +963,6 @@ psQuest* quest = mainQuest; // Substep is main step until substep is defined. int line_number = 0; NpcDialogMenu* pending_menu = NULL; - NpcDialogMenu* last_menu = NULL; Debug2(LOG_QUESTS, 0, "******** Parsing quest script quest id %d ********",quest_id); @@ -1009,9 +1017,14 @@ else if(!strncasecmp(block,"Menu:",5)) // Menu: is an nice way of represention the various P: triggers { NpcDialogMenu* menu = new NpcDialogMenu(); + if (quest && quest->GetParentQuest()) { + Debug3(LOG_QUESTS, 0, "Dialog Menu created for questid: %d, parentid: %d", quest_id, quest->GetParentQuest()->GetID()); + } else { + Debug2(LOG_QUESTS, 0, "Dialog Menu created for questid: %d, no quest obj!", quest_id); + } // Parse block and return a configured menu. - if(!BuildMenu(block, pending_triggers, mainQuest, menu)) + if(!ParseQuestScriptMenu(block, pending_triggers, mainQuest, menu)) { lastError.Format("Could not determine triggers in script '%s', in line <%s>", mainQuest?mainQuest->GetName():"KA",block.GetData()); @@ -1021,10 +1034,10 @@ return line_number; } - if(last_response) // popup is part of a dialog chain + if(latest.response) // popup is part of a dialog chain { - last_response->menu = menu; // attach the menu to the prior response for easy access in chains - last_menu = menu; // save so we can add prerequisites later + latest.response->menu = menu; // attach the menu to the prior response for easy access in chains + latest.menu = menu; // save so we can add prerequisites later } else { @@ -1048,7 +1061,7 @@ else // switch NPCs here { current_npc = npc_name; - next_to_last_response_id = last_response_id = -1; // When you switch NPCs, the prior responses must be reset also. + prior_response_id = latest.response_id = -1; // When you switch NPCs, the prior responses must be reset also. // if (pending_menu) // { // dict->AddMenu(current_npc, pending_menu); @@ -1074,35 +1087,37 @@ // Now add this response to the npc dialog dict if(which_trigger == 0) // new sequence - next_to_last_response_id = last_response_id; + prior_response_id = latest.response_id; - last_response = AddResponse(current_npc,response_text,last_response_id,quest,him,her,it,them,file_path); - if(last_response) + latest.response = AddResponse(current_npc,response_text,latest.response_id,quest,him,her,it,them,file_path); + if(latest.response) { - bool ret = AddTrigger(current_npc,pending_triggers[which_trigger++],next_to_last_response_id,last_response_id, quest, ""); + bool ret = AddTrigger(current_npc,pending_triggers[which_trigger++],prior_response_id,latest.response, quest, ""); if(!ret) { lastError.Format("Trigger could not be added on line %d", line_number); return line_number; } - if(!PrependPrerequisites(substep_requireop, response_requireop, quest_assigned_already && step_count > 1,last_response, mainQuest)) + if(!PrependPrerequisites(substep_requireop, response_requireop, quest_assigned_already && step_count > 1,latest.response, mainQuest)) { lastError.Format("PrependPrerequistes failed on line %d", line_number); return line_number; } + // TODO: research why the prerequisites get copied around here although they have been assigned above if(pending_menu) { // Now go back to the previous menu - pending_menu->SetPrerequisiteScript(last_response->GetPrerequisiteScript()); + pending_menu->SetPrerequisiteScript(latest.response->GetPrerequisiteScript()); dict->AddMenu(current_npc, pending_menu); pending_menu = NULL; } - else if(last_menu) + else if(latest.menu) { - last_menu->SetPrerequisiteScript(last_response->GetPrerequisiteScript()); - last_menu = NULL; + latest.menu->SetPrerequisiteScript(latest.response->GetPrerequisiteScript()); + dict->AddMenu(latest.menu); + latest.menu = NULL; } } else @@ -1141,8 +1156,8 @@ } // This clears out prior responses whether there is a quest or a KA script here - next_to_last_response_id = last_response_id = -1; - last_response = ... [truncated message content] |
From: <lpa...@us...> - 2014-10-05 10:29:32
|
Revision: 9593 http://sourceforge.net/p/planeshift/code/9593 Author: lpancallo Date: 2014-10-05 10:29:28 +0000 (Sun, 05 Oct 2014) Log Message: ----------- Updated version numbers to 0.6.3 Modified Paths: -------------- trunk/configure.ac trunk/src/common/util/pscssetup.h Modified: trunk/configure.ac =================================================================== --- trunk/configure.ac 2014-10-05 10:20:55 UTC (rev 9592) +++ trunk/configure.ac 2014-10-05 10:29:28 UTC (rev 9593) @@ -11,7 +11,7 @@ #---------------------------------------------------------------------------- # Initialize autoconf #---------------------------------------------------------------------------- -AC_INIT([PlaneShift], [0.6.1], [http://www.hydlaaplaza.com/flyspray/]) +AC_INIT([PlaneShift], [0.6.3], [http://www.hydlaaplaza.com/flyspray/]) CS_PACKAGEINFO([PlaneShift a 3d MMORPG], [Copyright (C)2001-2013 Atomic Blue], [http://www.planeshift.it/]) Modified: trunk/src/common/util/pscssetup.h =================================================================== --- trunk/src/common/util/pscssetup.h 2014-10-05 10:20:55 UTC (rev 9592) +++ trunk/src/common/util/pscssetup.h 2014-10-05 10:29:28 UTC (rev 9593) @@ -35,7 +35,7 @@ * @{ */ #ifndef PS_VERSION -#define PS_VERSION "0.6.1" +#define PS_VERSION "0.6.3" #endif #ifndef APPNAME This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2014-10-14 23:03:40
|
Revision: 9603 http://sourceforge.net/p/planeshift/code/9603 Author: joelyon Date: 2014-10-14 23:03:31 +0000 (Tue, 14 Oct 2014) Log Message: ----------- Neeno's fix for PS#6138 - sort storage on name, type, value etc. + Venalan's merchant window .xml Modified Paths: -------------- trunk/data/gui/merchant.xml trunk/src/client/gui/pawsguildwindow.cpp trunk/src/client/gui/pawsmerchantwindow.cpp trunk/src/client/gui/pawsstoragewindow.cpp trunk/src/common/paws/pawslistbox.cpp trunk/src/common/paws/pawslistbox.h Modified: trunk/data/gui/merchant.xml =================================================================== --- trunk/data/gui/merchant.xml 2014-10-11 22:12:13 UTC (rev 9602) +++ trunk/data/gui/merchant.xml 2014-10-14 23:03:31 UTC (rev 9603) @@ -1,11 +1,11 @@ <widget_description> <widget name="MerchantWindow" factory="pawsMerchantWindow" visible="no" movable="yes" keepaspect="no" resizable="yes" style="New Standard GUI" savepositions="yes" > - + <frame x="100" y="100" width="620" height="400" border="yes" /> <minframe width="550" height="165" /> <title resource="Scaling Title Bar" text="Merchant" align="left" close_button="yes"/> - <font r="121" g="147" b="42" size="15"/> - + <font r="121" g="147" b="42" size="15"/> + <widget name="Transact" factory="pawsButton" id="100" tooltip="Buy/Sell items"> <frame x="560" y="10" width="48" height="48" border="no" /> <bgimage resource="MerchantTrade" alpha="0" /> @@ -13,7 +13,7 @@ <attach point="ATTACH_RIGHT" /> </attachpoints> </widget> - + <widget name="TransactAll" factory="pawsButton" id="110" tooltip="Buy/Sell all selected items"> <frame x="560" y="62" width="48" height="48" border="no" /> <bgimage resource="MerchantTrade" alpha="0" /> @@ -21,7 +21,7 @@ <attach point="ATTACH_RIGHT" /> </attachpoints> </widget> - + <widget name="AllLabel" factory="pawsTextBox"> <frame x="560" y="100" width="48" height="20" /> <font name="LiberationSans-Regular.ttf" r="246" g="223" b="166" size="8" scalefont="no" /> @@ -30,7 +30,7 @@ <attach point="ATTACH_RIGHT" /> </attachpoints> </widget> - + <widget name="TransactSingle" factory="pawsButton" id="120" tooltip="Buy/Sell one item"> <frame x="560" y="114" width="48" height="48" border="no" /> <bgimage resource="MerchantTrade" alpha="0" /> @@ -38,7 +38,7 @@ <attach point="ATTACH_RIGHT" /> </attachpoints> </widget> - + <widget name="SingleLabel" factory="pawsTextBox"> <frame x="560" y="150" width="48" height="20" /> <font name="LiberationSans-Regular.ttf" r="246" g="223" b="166" size="8" scalefont="no" /> @@ -47,7 +47,7 @@ <attach point="ATTACH_RIGHT" /> </attachpoints> </widget> - + <widget name="View" factory="pawsButton" id="150" tooltip="View item"> <frame x="560" y="338" width="48" height="48" border="no" /> <bgimage resource="view" alpha="0" /> @@ -55,22 +55,22 @@ <attach point="ATTACH_RIGHT" /> </attachpoints> </widget> - + <widget name="BuySell" factory="pawsRadioButtonGroup" > <frame x="10" y="10" width="190" height="30" border="no" /> - + <radionode name="Buy" id="1000"> <frame x="0" y="0" width="75" height="30" /> <text string="Buy" position="right"/> </radionode> - + <radionode name="Sell" id="2000"> <frame x="115" y="0" width="75" height="30" /> <text string="Sell" position="right"/> </radionode> </widget> - - + + <widget name="Categories" factory="pawsListBox" id="10"> <frame x="12" y="45" width="190" height="340" border="no" /> <attachpoints> @@ -78,15 +78,15 @@ <attach point="ATTACH_TOP" /> <attach point="ATTACH_BOTTOM" /> </attachpoints> - + <columns height="23"> <column width="200" > <widget name="Category" factory="pawsTextBox"></widget> </column> </columns> </widget> - - + + <widget name="Items" factory="pawsListBox" id="11" sortBy="5"> <frame x="220" y="45" width="330" height="340" border="no" /> <attachpoints> @@ -95,11 +95,11 @@ <attach point="ATTACH_TOP" /> <attach point="ATTACH_BOTTOM" /> </attachpoints> - <columns height="32"> + <columns height="32" headings="yes" > <column width="30" > <widget name="#" factory="pawsTextBox"></widget> </column> - <column width="40" > + <column width="40" sortable="false"> <widget name="Item" factory="pawsWidget"></widget> </column> <column width="60" > @@ -113,8 +113,8 @@ </attachpoints> </widget> </column> - - + + <column width="0" > <widget name="" factory="pawsTextBox" visible="no"></widget> </column> @@ -123,30 +123,30 @@ </column> </columns> </widget> - + <!-- Slots for the money --> <!-- <widget name="circles" factory="pawsSlot" tooltip="Circles"> <frame x="350" y="340" width="48" height="48"/> <bgimage resource="MoneyCircles" alpha="0"/> </widget> - + <widget name="octas" factory="pawsSlot" tooltip="Octas"> <frame x="400" y="340" width="48" height="48"/> <bgimage resource="MoneyOctas" alpha="0"/> </widget> - + <widget name="hexas" factory="pawsSlot" tooltip="Hexas"> <frame x="450" y="340" width="48" height="48"/> <bgimage resource="MoneyHexas" alpha="0"/> </widget> - + <widget name="trias" factory="pawsSlot" tooltip="Trias"> <frame x="500" y="340" width="48" height="48"/> <bgimage resource="MoneyTrias" alpha="0"/> </widget> --> - + <widget name="TotalTrias" factory="pawsTextBox"> <frame x="330" y="15" width="220" height="20" /> <text string="0 Trias" horizAdjust="RIGHT" /> @@ -154,8 +154,8 @@ <attach point="ATTACH_RIGHT" /> </attachpoints> </widget> - + </widget> - - + + </widget_description> Modified: trunk/src/client/gui/pawsguildwindow.cpp =================================================================== --- trunk/src/client/gui/pawsguildwindow.cpp 2014-10-11 22:12:13 UTC (rev 9602) +++ trunk/src/client/gui/pawsguildwindow.cpp 2014-10-14 23:03:31 UTC (rev 9603) @@ -123,35 +123,6 @@ } -/** Function that compares listbox rows which contain pawsTextBoxWidget with numbers inside */ -int textBoxSortFunc_number(pawsWidget * widgetA, pawsWidget * widgetB) -{ - pawsTextBox * textBoxA, * textBoxB; - const char * textA, * textB; - int numA, numB; - - textBoxA = dynamic_cast <pawsTextBox*> (widgetA); - textBoxB = dynamic_cast <pawsTextBox*> (widgetB); - assert(textBoxA && textBoxB); - textA = textBoxA->GetText(); - if (textA == NULL) - textA = ""; - textB = textBoxB->GetText(); - if (textB == NULL) - textB = ""; - - numA = atoi(textA); - numB = atoi(textB); - - if (numA < numB) - return -1; - else if (numA == numB) - return 0; - else - return 1; -} - - ////////////////////////////////////////////////////////////////////// // Construction/Destruction ////////////////////////////////////////////////////////////////////// Modified: trunk/src/client/gui/pawsmerchantwindow.cpp =================================================================== --- trunk/src/client/gui/pawsmerchantwindow.cpp 2014-10-11 22:12:13 UTC (rev 9602) +++ trunk/src/client/gui/pawsmerchantwindow.cpp 2014-10-14 23:03:31 UTC (rev 9603) @@ -111,9 +111,19 @@ itemsBox = (pawsListBox*)FindWidget("Items"); trias = (pawsTextBox*)FindWidget("TotalTrias"); + if(!categoryBox || !itemsBox || !trias) + { + return false; + } + + itemsBox->SetSortingFunc(0, textBoxSortFunc_number); + itemsBox->SetSortingFunc(2, textBoxSortFunc_number); + itemsBox->SetSortingFunc(3, textBoxSortFunc); + return true; } + void pawsMerchantWindow::HandleMessage( MsgEntry* me ) { psGUIMerchantMessage incomming( me ); Modified: trunk/src/client/gui/pawsstoragewindow.cpp =================================================================== --- trunk/src/client/gui/pawsstoragewindow.cpp 2014-10-11 22:12:13 UTC (rev 9602) +++ trunk/src/client/gui/pawsstoragewindow.cpp 2014-10-14 23:03:31 UTC (rev 9603) @@ -108,9 +108,19 @@ itemsBox = (pawsListBox*)FindWidget("Items"); trias = (pawsTextBox*)FindWidget("TotalTrias"); + if(!categoryBox || !itemsBox || !trias) + { + return false; + } + + itemsBox->SetSortingFunc(0, textBoxSortFunc_number); + itemsBox->SetSortingFunc(2, textBoxSortFunc_number); + itemsBox->SetSortingFunc(3, textBoxSortFunc); + return true; } + void pawsStorageWindow::HandleMessage( MsgEntry* me ) { psGUIStorageMessage incoming( me ); Modified: trunk/src/common/paws/pawslistbox.cpp =================================================================== --- trunk/src/common/paws/pawslistbox.cpp 2014-10-11 22:12:13 UTC (rev 9602) +++ trunk/src/common/paws/pawslistbox.cpp 2014-10-14 23:03:31 UTC (rev 9603) @@ -1604,7 +1604,6 @@ } - int textBoxSortFunc(pawsWidget* widgetA, pawsWidget* widgetB) { pawsTextBox* textBoxA, * textBoxB; @@ -1633,3 +1632,31 @@ return strcmp(textA, textB); } + +/** Function that compares listbox rows which contain pawsTextBoxWidget with numbers inside */ +int textBoxSortFunc_number(pawsWidget * widgetA, pawsWidget * widgetB) +{ + pawsTextBox * textBoxA, * textBoxB; + const char * textA, * textB; + int numA, numB; + + textBoxA = dynamic_cast <pawsTextBox*> (widgetA); + textBoxB = dynamic_cast <pawsTextBox*> (widgetB); + assert(textBoxA && textBoxB); + textA = textBoxA->GetText(); + if (textA == NULL) + textA = ""; + textB = textBoxB->GetText(); + if (textB == NULL) + textB = ""; + + numA = atoi(textA); + numB = atoi(textB); + + if (numA < numB) + return -1; + else if (numA == numB) + return 0; + else + return 1; +} Modified: trunk/src/common/paws/pawslistbox.h =================================================================== --- trunk/src/common/paws/pawslistbox.h 2014-10-11 22:12:13 UTC (rev 9602) +++ trunk/src/common/paws/pawslistbox.h 2014-10-14 23:03:31 UTC (rev 9603) @@ -37,6 +37,8 @@ /** Compare function that works with listbox columns that are pawsTextBox widgets: */ int textBoxSortFunc(pawsWidget* widgetA, pawsWidget* widgetB); +/** Function that compares listbox rows which contain pawsTextBoxWidget with numbers inside */ +int textBoxSortFunc_number(pawsWidget * widgetA, pawsWidget * widgetB); //----------------------------------------------------------------------------- // struct ColumnInfo This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2014-11-29 15:31:50
|
Revision: 9661 http://sourceforge.net/p/planeshift/code/9661 Author: joelyon Date: 2014-11-29 15:31:48 +0000 (Sat, 29 Nov 2014) Log Message: ----------- Venalan's port of Neeno's page numbering for crafting books Modified Paths: -------------- trunk/data/gui/readbook.xml trunk/src/client/gui/pawsbookreadingwindow.cpp trunk/src/client/gui/pawsbookreadingwindow.h Modified: trunk/data/gui/readbook.xml =================================================================== --- trunk/data/gui/readbook.xml 2014-11-25 22:50:45 UTC (rev 9660) +++ trunk/data/gui/readbook.xml 2014-11-29 15:31:48 UTC (rev 9661) @@ -57,6 +57,17 @@ <bgimage resource="Scribe" /> </widget> + <pawsTextBox name="PageNum"> + <frame x="50" y="430" width="290" height="20" /> + <font name="becker-m.ttf" r="0" g="0" b="0" size="12" /> + <text horizAdjust="CENTRE" /> + </pawsTextBox> + <pawsTextBox name="PageNumRight"> + <frame x="380" y="430" width="290" height="20" /> + <font name="becker-m.ttf" r="0" g="0" b="0" size="12" /> + <text horizAdjust="CENTRE" /> + </pawsTextBox> + </widget> </widget_description> Modified: trunk/src/client/gui/pawsbookreadingwindow.cpp =================================================================== --- trunk/src/client/gui/pawsbookreadingwindow.cpp 2014-11-25 22:50:45 UTC (rev 9660) +++ trunk/src/client/gui/pawsbookreadingwindow.cpp 2014-11-29 15:31:48 UTC (rev 9661) @@ -82,6 +82,9 @@ // the same for the craft window, otherwise everything could bug descriptionCraftRight = dynamic_cast<pawsMultiPageTextBox*>(FindWidget("ItemDescriptionCraftRight")); //if ( !descriptionCraftRight ) return false; + + pageNum = dynamic_cast<pawsTextBox*>(FindWidget("PageNum")); + pageNumRight = dynamic_cast<pawsTextBox*>(FindWidget("PageNumRight")); writeButton = FindWidget("WriteButton"); //if ( !writeButton ) return false; @@ -162,6 +165,8 @@ //set the background image for the book bookBgImage = PawsManager::GetSingleton().GetTextureManager()->GetPawsImage(mesg.backgroundImg); usingCraft = false; + // set page numbers + UpdatePageNumbers(usingCraft); break; } case MSGTYPE_CRAFT_INFO: @@ -203,9 +208,11 @@ // show both pages descriptionCraft->Show(); - descriptionCraftRight->Show(); + descriptionCraftRight->Show(); usingCraft = true; + // set page numbers + UpdatePageNumbers(usingCraft); } //name->SetText("You discover you can do the following:"); name->SetText(""); @@ -244,6 +251,7 @@ } } } + UpdatePageNumbers(usingCraft); } void pawsBookReadingWindow::SetPage(int page) @@ -273,6 +281,8 @@ descriptionCraftRight->SetCurrentPageNum(page+1); } } + + UpdatePageNumbers(usingCraft); } @@ -371,13 +381,13 @@ return true; } - if(widget->GetID() == NEXT) + else if(widget->GetID() == nextButton->GetID()) { TurnPage(1); return true; } - if(widget->GetID() == PREV) + else if(widget->GetID() == prevButton->GetID()) { TurnPage(-1); return true; @@ -389,6 +399,65 @@ return true; } +void pawsBookReadingWindow::UpdatePageNumbers(bool mode) +{ + int pageNumber; + csString number; + + if(mode) + { + pageNumber = descriptionCraft->GetCurrentPageNum(); + } + else + { + pageNumber = description->GetCurrentPageNum(); + } + number.Format("%d", pageNumber+1); + pageNum->SetText(number); + number.Format("%d", pageNumber+2); + pageNumRight->SetText(number); + + if(numPages >= 2) + { + if(numPages & 1) // uneven + { + if(pageNumber == numPages-1) + { + nextButton->Hide(); + } + else + { + nextButton->Show(); + } + } + else // even + { + if(pageNumber == numPages) + { + nextButton->Hide(); + } + else + { + nextButton->Show(); + } + } + + if(pageNumber == 0) // first pages + { + prevButton->Hide(); + } + else + { + prevButton->Show(); + } + } + else + { + nextButton->Hide(); + prevButton->Hide(); + } +} + bool pawsBookReadingWindow::isBadChar(char c) { csString badChars = "/\\?%*:|\"<>"; Modified: trunk/src/client/gui/pawsbookreadingwindow.h =================================================================== --- trunk/src/client/gui/pawsbookreadingwindow.h 2014-11-25 22:50:45 UTC (rev 9660) +++ trunk/src/client/gui/pawsbookreadingwindow.h 2014-11-29 15:31:48 UTC (rev 9661) @@ -60,7 +60,10 @@ virtual bool OnButtonPressed(int mouseButton, int keyModifier, pawsWidget* widget); private: + void UpdatePageNumbers(bool mode); pawsTextBox* name; + pawsTextBox* pageNum; + pawsTextBox* pageNumRight; pawsMultiPageTextBox* description; pawsMultiPageTextBox* descriptionRight; pawsMultiPageTextBox* descriptionCraft; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <jo...@us...> - 2014-11-30 23:47:54
|
Revision: 9666 http://sourceforge.net/p/planeshift/code/9666 Author: joelyon Date: 2014-11-30 23:47:51 +0000 (Sun, 30 Nov 2014) Log Message: ----------- Venalan's adaptation of Aiwendil's enhanced window control commands Modified Paths: -------------- trunk/src/client/cmdusers.cpp trunk/src/client/gui/pawscontrolwindow.cpp trunk/src/client/gui/pawscontrolwindow.h Added Paths: ----------- trunk/data/gui/windownames.xml Added: trunk/data/gui/windownames.xml =================================================================== --- trunk/data/gui/windownames.xml (rev 0) +++ trunk/data/gui/windownames.xml 2014-11-30 23:47:51 UTC (rev 9666) @@ -0,0 +1,124 @@ +<!-- data/gui/windowsnames.xml + Definition file for windows controlled by pawsControlWindow + Author: Fabian Stock (Aiw...@go...) + License: GPL + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +--> +<windows> + <window name="ActiveMagicWindow"> + <alternativeName name="activemagic"/> + <alternativeName name="activeeffect"/> + <alternativeName name="activeeffects"/> + </window> + <window name="AttackBookWindow"> + <alternativeName name="attack book"/> + <alternativeName name="attacks"/> + </window> + <window name="BookReadingWindow"> + <alternativeName name="read"/> + </window> + <window name="BuddyWindow"> + <alternativeName name="buddy"/> + </window> + <window name="ChatWindow"> + <alternativeName name="talk"/> + <alternativeName name="chat"/> + <alternativeName name="communications"/> + </window> + <window name="CraftWindow"> + <alternativeName name="craft"/> + <alternativeName name="study"/> + </window> + <window name="ConfigWindow"> + <alternativeName name="options"/> + </window> + <window name="DetailWindow"> + <alternativeName name="detail"/> + </window> + <window name="ExchangeWindow"> + <alternativeName name="exchange"/> + </window> + <window name="GlyphWindow"> + <alternativeName name="glyph"/> + </window> + <window name="GroupWindow"> + <alternativeName name="group"/> + </window> + <window name="GuildWindow"> + <alternativeName name="guild"/> + </window> + <window name="GmGUI"> + <alternativeName name="gm"/> + </window> + <window name="HelpWindow"> + <alternativeName name="help"/> + </window> + <window name="InfoWindow"> + <alternativeName name="info"/> + </window> + <window name="IgnoreWindow"> + <alternativeName name="ignore"/> + </window> + <window name="InventoryWindow"> + <alternativeName name="inventory"/> + <alternativeName name="inv"/> + </window> + <window name="LootWindow"> + <alternativeName name="loot"/> + </window> + <window name="MerchantWindow"> + <alternativeName name="merchant"/> + </window> + <window name="MusicWindow"> + <alternativeName name="music"/> + </window> + <window name="PetitionGMWindow"> + <alternativeName name="managepetitions"/> + </window> + <window name="PetitionWindow"> + <alternativeName name="petition"/> + <alternativeName name="petitions"/> + </window> + <window name="QuestNotebook"> + <alternativeName name="quest"/> + <alternativeName name="quests"/> + </window> + <window name="QuestRewardWindow"> + <alternativeName name="questreward"/> + </window> + <window name="ShortcutMenu"> + <alternativeName name="shortcut"/> + <alternativeName name="shortcuts"/> + </window> + <window name="SketchWindow"> + <alternativeName name="sketch"/> + </window> + <window name="SkillWindow"> + <alternativeName name="stats"/> + <alternativeName name="skills"/> + </window> + <window name="SmallInventoryWindow"> + <alternativeName name="bag"/> + <alternativeName name="smallinventory"/> + </window> + <window name="SpellBookWindow"> + <alternativeName name="spell book"/> + <alternativeName name="spells"/> + </window> + <window name="WritingWindow"> + <alternativeName name="write"/> + </window> +</windows> Property changes on: trunk/data/gui/windownames.xml ___________________________________________________________________ Added: svn:mime-type ## -0,0 +1 ## +text/plain \ No newline at end of property Added: svn:eol-style ## -0,0 +1 ## +native \ No newline at end of property Modified: trunk/src/client/cmdusers.cpp =================================================================== --- trunk/src/client/cmdusers.cpp 2014-11-30 06:24:35 UTC (rev 9665) +++ trunk/src/client/cmdusers.cpp 2014-11-30 23:47:51 UTC (rev 9666) @@ -132,7 +132,8 @@ cmdsource->Subscribe("/unmount", this); cmdsource->Subscribe("/unstick", this); cmdsource->Subscribe("/use", this); - cmdsource->Subscribe("/who", this); // list players on server + cmdsource->Subscribe("/who", this); // list players on server + cmdsource->Subscribe("/window", this); // handles extended window options cmdsource->Subscribe("/write", this); cmdsource->Subscribe("/yield", this); cmdsource->Subscribe("/takeall", this); // Take all items from a container @@ -220,11 +221,12 @@ cmdsource->Unsubscribe("/unstick", this); cmdsource->Unsubscribe("/use", this); cmdsource->Unsubscribe("/who", this); + cmdsource->Unsubscribe("/window", this); // handles extended window options cmdsource->Unsubscribe("/write", this); cmdsource->Unsubscribe("/yield", this); cmdsource->Unsubscribe("/takeall", this); cmdsource->Unsubscribe("/takestackall", this); - cmdsource->Unsubscribe("/attacklist", this); //temp + cmdsource->Unsubscribe("/attacklist", this); //temp cmdsource->Unsubscribe("/setdesc", this); cmdsource->Unsubscribe("/setoocdesc", this); cmdsource->Unsubscribe("/loaddesc", this); @@ -324,19 +326,153 @@ if (words.GetCount() == 0) return ""; + int wordCount = words.GetCount(); - if ( words[0] == "/show") + //this section handles the over lap between the original /show command and the newer /window [name] show/hide command both are kept to allow legacy use + if (words[0] == "/show" || (words[0] == "/window" && wordCount==3 && (words[2] == "show" || words[2] == "hide" ))) { - if (words.GetCount() > 1) + if (words[0] == "/show" && wordCount == 2) { pawsControlWindow* ctrlWindow = dynamic_cast<pawsControlWindow*>(PawsManager::GetSingleton().FindWidget("ControlWindow")); if(!ctrlWindow || ctrlWindow->HandleWindowName(words[1])) + { return NULL; - + } else return "That window cannot be found."; } - return "You need to specify a window to show"; + else if (wordCount == 3) + { + if (words[2] == "show") + { + pawsControlWindow* ctrlWindow = dynamic_cast<pawsControlWindow*>(PawsManager::GetSingleton().FindWidget("ControlWindow")); + if(!ctrlWindow || ctrlWindow->showWindowName(words[1])) + { + return NULL; + } + else + { + return "That window cannot be found."; + } + } + if (words[2] == "hide") + { + pawsControlWindow* ctrlWindow = dynamic_cast<pawsControlWindow*>(PawsManager::GetSingleton().FindWidget("ControlWindow")); + if(!ctrlWindow || ctrlWindow->hideWindowName(words[1])) + { + return NULL; + } + else + { + return "That window cannot be found."; + } + } + } + return "Usage: /[show|window] [windowname] [hide|show]"; } + else if ( words[0] == "/window" ) + { + if (wordCount == 5 && words[2] == "setposition") + { + pawsControlWindow* ctrlWindow = dynamic_cast<pawsControlWindow*>(PawsManager::GetSingleton().FindWidget("ControlWindow")); + if(!ctrlWindow) + { + return "Control window could not be found."; + } + // negative coordinates are relative to the lower right corner + int x = atoi(words[3]); + int y = atoi(words[4]); + if (x < 0) + { + x = psengine->GetG2D()->GetWidth() + x; + } + if (y < 0) + { + y = psengine->GetG2D()->GetHeight() + y; + } + if(ctrlWindow->setWindowPositionName(words[1], x, y)) + { + return NULL; + } + else + { + return "That window cannot be found."; + } + return "Usage: /window [windowname] setposition [x] [y]"; + } + else if ( wordCount == 3 && words[2] == "getinfo" ) + { + pawsControlWindow* ctrlWindow = dynamic_cast<pawsControlWindow*>(PawsManager::GetSingleton().FindWidget("ControlWindow")); + if (!ctrlWindow) + { + return "Control window could not be found."; + } + + pawsChatWindow* chatWindow = (pawsChatWindow*)PawsManager::GetSingleton().FindWidget("ChatWindow"); + if(chatWindow) + { + csString info=ctrlWindow->getWindowInfo(words[1]); + + if( info.Length() < 1) + { + return "That window cannot be found."; + } + chatWindow->ChatOutput(info); + return NULL; + } + else + { + return "Could not write window names to Chat"; + } + return "Usage: /window [windowname] getinfo"; + } + else if (wordCount == 5 && words[2] == "setsize") + { + pawsControlWindow* ctrlWindow = dynamic_cast<pawsControlWindow*>(PawsManager::GetSingleton().FindWidget("ControlWindow")); + if(!ctrlWindow) + { + return "Control window could not be found."; + } + int x = atoi(words[3]); + int y = atoi(words[4]); + if( x<1 || y<1 ) + { + return "window size must be greater than 0"; + } + if(ctrlWindow->setWindowSizeName(words[1], x, y)) + { + return NULL; + } + else + { + return "That window cannot be found."; + } + return "Usage: /window [windowname] setsize [x] [y]"; + } + else if ( words[1] == "list" ) + { + pawsControlWindow* ctrlWindow = dynamic_cast<pawsControlWindow*>(PawsManager::GetSingleton().FindWidget("ControlWindow")); + if (!ctrlWindow) + { + return "Control window could not be found."; + } + + pawsChatWindow* chatWindow = (pawsChatWindow*)PawsManager::GetSingleton().FindWidget("ChatWindow"); + if(chatWindow) + { + chatWindow->ChatOutput(ctrlWindow->getWindowNames()); + return NULL; + } + else + { + return "Could not write window names to Chat"; + } + return "Usage: /window list"; + } + else + { + return "Usage: /window [list|name|all] [getinfo|setposition|setsize|show|hide] [x] [y]"; + } + } else if ( words[0] == "/study" ) { pawsWidget * widget = PawsManager::GetSingleton().FindWidget("CraftWindow"); @@ -345,9 +481,9 @@ return NULL; } - else if (words[0] == "/equip" || (words[0] == "/use" && words.GetCount() > 1)) + else if (words[0] == "/equip" || (words[0] == "/use" && wordCount > 1)) { - if ( words.GetCount() < 2 ) + if ( wordCount < 2 ) return "Usage: /equip [stack count] [slot] [item name]"; size_t tail = 1; @@ -355,7 +491,7 @@ if (quantity > 0) { tail++; - if ( tail >= words.GetCount() ) + if ( tail >= wordCount ) return "Usage: /equip [stack count] [slot] [item name]"; } else @@ -369,7 +505,7 @@ { slotID = toSlot->ID(); tail++; - if ( tail >= words.GetCount() ) + if ( tail >= wordCount ) return "Usage: /equip [stack count] [slot] [item name]"; } @@ -381,7 +517,7 @@ else if ( words[0] == "/dequip" ) { - if ( words.GetCount() < 2 ) + if ( wordCount < 2 ) return "Usage: /dequip [item name|slot name]"; pawsInventoryWindow* window = (pawsInventoryWindow*)PawsManager::GetSingleton().FindWidget("InventoryWindow"); @@ -391,7 +527,7 @@ else if ( words[0] == "/write" ) { - if ( words.GetCount() < 2 ) + if ( wordCount < 2 ) return "Usage: /write [item name|slot name]"; pawsInventoryWindow* window = (pawsInventoryWindow*)PawsManager::GetSingleton().FindWidget("InventoryWindow"); @@ -401,7 +537,7 @@ else if (words[0] == "/rotate") { - if ( words.GetCount() < 2 ) + if ( wordCount < 2 ) return "Usage: /rotate [target] [x|reset] [y|reset] [z|reset] or /rotate [target] [x|y|z] [angle]"; bool targetGiven = false; @@ -441,7 +577,7 @@ else if (words[0] == "/sell") { csString buff; - if (words.GetCount() > 1){ + if (wordCount > 1){ csString tail = words.GetTail(1); buff.Format("<R TYPE=\"SELL\" TARGET=\"%s\"/>",tail.GetData()); } @@ -463,7 +599,7 @@ else if ( words[0] == "/brightness" ) { const char* usage = "Usage: /brightness [<value>|increase|decrease|reset]"; - if (words.GetCount() != 2) //if there were no arguments open the buddy window + if (wordCount != 2) //if there were no arguments open the buddy window { return usage; } @@ -514,7 +650,7 @@ } else if ( words[0] == "/buddy" ) { - if (words.GetCount() < 2) //if there were no arguments open the buddy window + if (wordCount < 2) //if there were no arguments open the buddy window { pawsWidget* window = PawsManager::GetSingleton().FindWidget("BuddyWindow"); if ( !window ) @@ -531,7 +667,7 @@ else if (words[0] == "/buy") { csString buff; - if (words.GetCount() > 1){ + if (wordCount > 1){ csString tail = words.GetTail(1); buff.Format("<R TYPE=\"BUY\" TARGET=\"%s\"/>",tail.GetData()); } @@ -546,7 +682,7 @@ else if (words[0] == "/storage") { csString buff; - if (words.GetCount() > 1) + if (wordCount > 1) { csString tail = words.GetTail(1); buff.Format("<R TYPE=\"STORE\" TARGET=\"%s\"/>",tail.GetData()); @@ -580,7 +716,7 @@ if ( !window ) return "Ignore Window Not Found"; - if (words.GetCount() < 2) //If the player didn't provide arguments just open the ignore window + if (wordCount < 2) //If the player didn't provide arguments just open the ignore window window->Show(); else //If the player provided a name apply the setting { @@ -615,13 +751,13 @@ else if (words[0] == "/cast") { - if (words.GetCount() <= 1) + if (wordCount <= 1) return "You must specify a spell name"; csString spell; float KFactor; - if (words.GetCount() > 2 && sscanf(words[1], "%f", &KFactor) == 1) + if (wordCount > 2 && sscanf(words[1], "%f", &KFactor) == 1) { spell = words.GetTail(2); } @@ -641,7 +777,7 @@ { pawsChatWindow* ChatWindow = (pawsChatWindow*) PawsManager::GetSingleton().FindWidget("ChatWindow"); - if (words.GetCount() > 1) + if (wordCount > 1) ChatWindow->SetAway( words.GetTail(1) ); else ChatWindow->SetAway(""); @@ -652,11 +788,11 @@ int tab = -1; const char* output = "/clear <all|main|channels|npc|whisper|guild|alliance|group|auction|system|help>"; - if(words.GetCount() > 2) + if(wordCount > 2) { return output; } - else if(words.GetCount() == 2) + else if(wordCount == 2) { if(words[1] == "all") { @@ -840,7 +976,7 @@ //get the chatwindow for use later pawsChatWindow* chatWindow = dynamic_cast<pawsChatWindow*>(PawsManager::GetSingleton().FindWidget("ChatWindow")); - if (words.GetCount() < 2) + if (wordCount < 2) return "You must enter the text. e.g /Advice [user] <text>"; csString pPerson( words[1] ); csString pText(words.GetTail(2)); @@ -857,7 +993,7 @@ { const char *errorMsg = "You must enter the text. e.g /pet [petnumber,] <assist|attack|dismiss|follow|guard|name|run|stay|stopattack|summon|target|walk> <options>"; - if (words.GetCount() < 2) + if (wordCount < 2) return errorMsg; csString pCommand = words[1]; @@ -865,7 +1001,7 @@ // Check for "," in word 2. This could // happen if the pet name is in quotes. - if (words.GetCount() > 2 && words[2] == ",") + if (wordCount > 2 && words[2] == ",") { pCommand += ","; words.DeleteIndex(2); @@ -875,7 +1011,7 @@ if ( pCommand.FindFirst( ',' ) != (size_t)-1 ) { // Pet name specified - if (words.GetCount() < 3) + if (wordCount < 3) return errorMsg; pCommand = words[2]; target = words[1]; @@ -1055,7 +1191,7 @@ } else if (words[0] == "/drop") { - if (words.GetCount() < 2) + if (wordCount < 2) return "Usage: /drop [quantity] (any) (noguard) (inplace) [item name]"; int quantity; csString itemName; @@ -1120,7 +1256,7 @@ } else if(words[0] == "/emote") { - if(words.GetCount() < 2 || words[1] == "list") + if(wordCount < 2 || words[1] == "list") { //generate a message csString emotelistmsg = "List of emotes:\n"; @@ -1183,7 +1319,7 @@ } else if(words[0] == "/join") { - if(words.GetCount() < 2) + if(wordCount < 2) { return "Please specify a channel name to join."; } @@ -1195,7 +1331,7 @@ } else if(words[0] == "/leave") { - if(words.GetCount() < 2) + if(wordCount < 2) { return "Please specify a channel hotkey number to leave."; } @@ -1213,7 +1349,7 @@ } else if (words[0] == "/setdesc") { - if (words.GetCount() < 2) + if (wordCount < 2) { return "Please specify the description for this character."; } @@ -1229,7 +1365,7 @@ } else if (words[0] == "/setoocdesc") { - if (words.GetCount() < 2) + if (wordCount < 2) { return "Please specify the OOC description for this character."; } @@ -1245,7 +1381,7 @@ } else if (words[0] == "/loaddesc") { - if (words.GetCount() < 2) + if (wordCount < 2) { return "Please specify the filename of the description to load."; } @@ -1279,7 +1415,7 @@ } else if (words[0] == "/loadoocdesc") { - if (words.GetCount() < 2) + if (wordCount < 2) { return "Please specify the filename of the ooc description to load."; } @@ -1314,7 +1450,7 @@ } else if (words[0] == "/loadshortcuts") { - if (words.GetCount() < 2) + if (wordCount < 2) { return "Please specify the filename of the shortcuts to load."; } @@ -1350,7 +1486,7 @@ } else if(words[0] == "/saveshortcuts") { - if (words.GetCount() < 2) + if (wordCount < 2) { return "Please specify the filename to save shortcuts into."; } @@ -1390,7 +1526,7 @@ static const char* enabledMessage = "Run mode enabled"; static const char* disabledMessage = "Run mode disabled"; - if (words.GetCount() < 2) + if (wordCount < 2) { if (psengine->GetCharControl()->GetMovementManager()->ToggleRun()) { @@ -1401,7 +1537,7 @@ return disabledMessage; } } - else if (words.GetCount() == 2) + else if (wordCount == 2) { if (words[1] == "run") { Modified: trunk/src/client/gui/pawscontrolwindow.cpp =================================================================== --- trunk/src/client/gui/pawscontrolwindow.cpp 2014-11-30 06:24:35 UTC (rev 9665) +++ trunk/src/client/gui/pawscontrolwindow.cpp 2014-11-30 23:47:51 UTC (rev 9666) @@ -59,6 +59,8 @@ #define ICONS 14 ////////////////////////////////////////////////////////////////////// +// consts +const char* WINDOWNAMESFILE ="/planeshift/data/gui/windownames.xml"; ////////////////////////////////////////////////////////////////////// // Construction/Destruction @@ -120,6 +122,94 @@ buttonUp = FindWidget("ShowButtonUp"); buttonDown = FindWidget("ShowButtonDown"); + + //get a list of all controlled windows and their alternative names + // first we clean the old array, who knows what was in there before or if this is the second time PostSetup runs + controlledWindows.Empty(); + // then we crate a XML document reader... + csRef<iDocumentSystem> xml = psengine->GetXMLParser (); + csRef<iDocument> doc = xml->CreateDocument(); + csRef<iVFS> vfs = csQueryRegistry<iVFS > ( PawsManager::GetSingleton().GetObjectRegistry()); + if (!vfs) + { + // well, if we got here the question is probably how we got this far at all. + Error1("interresting...couldn't load the virtual file system plugin. Something is definitively fishy"); + return false; + } + // ...and read the file with the names and alternative names with it... + csRef<iDataBuffer> buf(vfs->ReadFile (WINDOWNAMESFILE)); + if (!buf || !buf->GetSize ()) + { + Error2("Error reading windows name file %s", WINDOWNAMESFILE); + return false; + } + // ..just to hand it over to the XML parser + const char* error = doc->Parse( buf ); + if ( error ) + { + Error2("Error loading windows names file: %s", error); + return false; + } + // now the real work starts...making sense out of the xml file and storing it for later use + csRef<iDocumentNode> rootNode = doc->GetRoot(); + if(!rootNode) + { + Error2("No XML root in %s", WINDOWNAMESFILE); + return false; + } + csRef<iDocumentNodeIterator> windowsIt = rootNode->GetNodes(); + // iterate through all nodes + while(windowsIt->HasNext()) + { + csRef<iDocumentNode> baseNode = windowsIt->Next(); + csString baseNodeName (baseNode->GetValue()); + if (baseNodeName == "windows") + { + csRef<iDocumentNodeIterator> winIt = baseNode->GetNodes(); + while(winIt->HasNext()) + { + csRef<iDocumentNode> curNode = winIt->Next(); + // check if it's a <window> node + csString nodeName (curNode->GetValue()); + if (nodeName == "window") + { + // found a <windows> node, lets store it's content + WindowNames windowName; + windowName.name = curNode->GetAttributeValue("name"); + if(!windowName.name.Length()) + { + // no name given for this window, not good + Error2("Missing window name in %s", WINDOWNAMESFILE); + return false; + } + // now we also store the alternative names of this window + csRef<iDocumentNodeIterator> altNamesIt = curNode->GetNodes(); + while (altNamesIt->HasNext()) + { + csRef<iDocumentNode> altNameNode = altNamesIt->Next(); + csString nodeAltName (altNameNode->GetValue()); + // check if we found a <alternativeName> node + if (nodeAltName == "alternativeName") + { + csString altName = altNameNode->GetAttributeValue("name"); + if(!altName.Length()) + { + // we got a alternative name node but no "name" attribute...bad + Error2("Missing alternative window name in %s", WINDOWNAMESFILE); + return false; + } + // for alt names we only want lowercase versions + altName.Downcase(); + // store all found alternative names + windowName.alternativeNames.Push(altName); + } + } + // last but no least we save the struct for later use + controlledWindows.Push(windowName); + } + } + } + } return true; } @@ -296,86 +386,302 @@ bool pawsControlWindow::HandleWindowName(csString widgetStr) { - csString widget; - widgetStr.Downcase(); - if(widgetStr == "options" ) - widget = "ConfigWindow"; - else if(widgetStr == "stats" || widgetStr =="skills") - widget = "SkillWindow"; - else if(widgetStr == "spell book" || widgetStr == "spells") - widget = "SpellBookWindow"; - else if(widgetStr == "inventory" || widgetStr == "inv") - widget = "InventoryWindow"; - else if(widgetStr == "attackwindow") - widget = "AttackBookWindow"; - else if(widgetStr == "help") - widget = "HelpWindow"; - else if(widgetStr == "buddy") - widget = "BuddyWindow"; - else if(widgetStr == "info") - widget = "InfoWindow"; - else if(widgetStr == "petition" || widgetStr == "petitions") - widget = "PetitionWindow"; - else if(widgetStr == "quest") - widget = "QuestNotebook"; - else if(widgetStr == "gm") - widget = "GmGUI"; - else if(widgetStr == "shortcut") - widget = "ShortcutMenu"; - else if(widgetStr == "group") - widget = "GroupWindow"; - else if(widgetStr == "guild") - widget = "GuildWindow"; - else if(widgetStr == "glyph") - widget = "GlyphWindow"; - else if(widgetStr == "sketch") - widget = "SketchWindow"; - else if(widgetStr == "merchant") - widget = "MerchantWindow"; - else if(widgetStr == "loot") - widget = "LootWindow"; - else if(widgetStr == "detail") - widget = "DetailWindow"; - else if(widgetStr == "exchange") - widget = "ExchangeWindow"; - else if(widgetStr == "write") - widget = "WritingWindow"; - else if(widgetStr == "read") - widget = "BookReadingWindow"; - else if(widgetStr == "questreward") - widget = "QuestRewardWindow"; - else if(widgetStr == "craft") - widget = "CraftWindow"; - else if(widgetStr == "ignore") - widget = "IgnoreWindow"; - else if(widgetStr == "bag" || widgetStr == "smallinventory") - widget = "SmallInventoryWindow"; - else if(widgetStr == "talk" || widgetStr == "chat" || widgetStr == "communications") - widget = "ChatWindow"; - else if(widgetStr == "activemagic") - widget = "ActiveMagicWindow"; - else if(widgetStr == "managepetitions") - widget = "PetitionGMWindow"; - else if(widgetStr == "music") - widget = "MusicWindow"; - else if(widgetStr == "quit") + // first some special cases + csString widget = widgetStr; + widget.Downcase(); + if(widget == "quit") { HandleQuit(); return true; } - else if(widgetStr == "buy") + if(widget == "buy") { psengine->GetCmdHandler()->Execute("/buy"); return true; } - if(widget) + // now the general window handling + // first we translate the given name to the real window name + widget = translateWidgetName(widgetStr); + // if the translation was successful we "handle" the window + if(widget != "") { HandleWindow(widget); return true; } + // otherwise we return with an error else return false; } + +bool pawsControlWindow::showWindow(csString widgetStr) +{ + // lets see if we can find the specified window + pawsWidget* widget = PawsManager::GetSingleton().FindWidget(widgetStr.GetData()); + if (!widget) + { + // doesn't look like it, log and return with an error + Error2("%s isn't loaded", widgetStr.GetData()); + return false; + } + // if the window was not visible before we show it now. + if ( !widget->IsVisible() ) + { + widget->Show(); + } + return true; +} + +bool pawsControlWindow::hideWindow(csString widgetStr) +{ + // lets see if we can find the specified window + pawsWidget* widget = PawsManager::GetSingleton().FindWidget(widgetStr.GetData()); + if (!widget) + { + // doesn't look like it, log and return with an error + Error2("%s isn't loaded", widgetStr.GetData()); + return false; + } + // if the window was not visible before we show it now. + if ( widget->IsVisible() ) + { + widget->Hide(); + // Don't leave focus on us after hiding + if ( this->Includes(PawsManager::GetSingleton().GetCurrentFocusedWidget()) ) + { + PawsManager::GetSingleton().SetCurrentFocusedWidget(NULL); + } + } + return true; +} +bool pawsControlWindow::showWindowName(csString widgetStr) +{ + // special window handling + csString widget = widgetStr; + widget.Downcase(); + if(widget == "quit") + { + HandleQuit(); + return true; + } + if(widget == "buy") + { + psengine->GetCmdHandler()->Execute("/buy"); + return true; + } + // and the "normal" windows + widget = translateWidgetName(widgetStr); + if(widget != "") + { + // if the window was found show it + return showWindow(widget); + } + else return false; +} + +bool pawsControlWindow::hideWindowName(csString widgetStr) +{ + // special window handling + csString widget = widgetStr; + widget.Downcase(); + if(widget == "quit") + { + // well, hiding of quit is not supported (and doesn't really make sense) + return false; + } + if(widget == "buy") + { + // hiding of /buy isn't supported either at the moment + return false; + } + // translate the given name and hide the window if found + widget = translateWidgetName(widgetStr); + if(widget != "") + { + return hideWindow(widget); + } + else return false; +} + +bool pawsControlWindow::setWindowPositionName(csString widgetStr, int x, int y) +{ + csString widget = translateWidgetName(widgetStr); + + // set the new position of the window + if(widget != "") + { + pawsWidget* w = PawsManager::GetSingleton().FindWidget(widget.GetData()); + if (!w) + { + Error2("%s isn't loaded", widget.GetData()); + return false; + } + w->SetRelativeFramePos(x,y); + w->Resize(); + // needed to prevent some drawing errors...PAWS calls resize for parent widget but not the childern. + return true; + } + return false; +} + +bool pawsControlWindow::setWindowSizeName(csString widgetStr, int width, int height) +{ + csString widget = translateWidgetName(widgetStr); + + // set the new size of the window + if(widget != "") + { + pawsWidget* w = PawsManager::GetSingleton().FindWidget(widget.GetData()); + if (!w) + { + Error2("%s isn't loaded", widget.GetData()); + return false; + } + // first check if the window is resizeable at all, if not do nothing + if (w->IsResizable()) + { + // then we check for the allowed minimum size + int minWidth, minHeight; + w->GetMinSize(minWidth, minHeight); + // if the given size is smaller than that set it to the minimum size + if (width < minWidth) + { + width = minWidth; + } + if (height < minHeight) + { + height = minHeight; + } + // and last but not least set the size + w->SetSize(width,height); + // needed to prevent some drawing errors...PAWS calls resize for all child widgets but not the parent itself. + w->Resize(); + } + return true; + } + return false; +} + +csString pawsControlWindow::getWindowNames() +{ + csString returnNames = ""; + for (unsigned int i=0; i < controlledWindows.GetSize(); i++) + { + // add the real window name + returnNames.Append(controlledWindows[i].name); + for (unsigned int j=0; j<controlledWindows[i].alternativeNames.GetSize(); j++) + { + // add every found alternative name + returnNames.Append(" | ").Append(controlledWindows[i].alternativeNames[j]); + } + // add a newline after every window type + returnNames.Append("\n"); + } + return returnNames; +} + +csString pawsControlWindow::getWindowInfo(csString widgetStr) +{ + csString returnPositions = ""; + // check if all positions are requested or only a specific window + csString window = widgetStr; + window.Downcase(); + if (window == "all") + { + // so we want the positiosn of all windows + for (unsigned int i = 0; i < controlledWindows.GetSize(); i++) + { + pawsWidget* widget = PawsManager::GetSingleton().FindWidget(controlledWindows[i].name.GetData()); + // error checking...this should only fail if someone messed up the definition file WINDOWNAMESFILE + if (!widget) + { + // window could not be found + Error2("%s isn't loaded", widgetStr.GetData()); + csString errMsg = "Could not find window "; + errMsg.Append(controlledWindows[i].name); + return errMsg; + } + else + { + // get the postion and add it to the string + csRect rect = widget->GetScreenFrame(); + returnPositions.Append(controlledWindows[i].name).Append(" x:").Append(rect.xmin).Append("|").Append(rect.xmin-graphics2D->GetWidth()) + .Append(" y:").Append(rect.ymin).Append("|").Append(rect.ymin-graphics2D->GetHeight()) + .Append(" width:").Append(rect.Width()).Append(" height:").Append(rect.Height()).Append("\n"); + } + } + } + else + { + // specific window + window = translateWidgetName(widgetStr); + if( window == "" ) + { + // window could not be found + Error2("%s Could not be found.", widgetStr.GetData()); + csString errMsg = "Could not find window "; + errMsg.Append(widgetStr); + return errMsg; + } + + pawsWidget* widget = PawsManager::GetSingleton().FindWidget(window.GetData()); + if (!widget) + { + // window could not be found + Error2("%s Could not be found.", widgetStr.GetData()); + csString errMsg = "Could not find window "; + errMsg.Append(window); + return errMsg; + } + else + { + // put the position in the string + csRect rect = widget->GetScreenFrame(); +// returnPositions.Append(window).Append(" x:").Append(rect.xmin).Append("|").Append(rect.xmin-graphics2D->GetWidth()) +// .Append(" y:").Append(rect.ymin).Append("|").Append(rect.ymin-graphics2D->GetHeight()) +// .Append(" width:").Append(rect.Width()).Append(" height:").Append(rect.Height()); + returnPositions.Format( "%s x:%d | %d y:%d | %d width:%d height:%d", + window.GetData(), + rect.xmin, + rect.xmin-graphics2D->GetWidth(), + rect.ymin, + rect.ymin-graphics2D->GetHeight(), + rect.Width(), + rect.Height() ); + } + } + return returnPositions; +} + +csString pawsControlWindow::translateWidgetName(csString widgetStr) +{ + // first we convert to lowercase to be case-insensitive + widgetStr.Downcase(); + csString compareName; + // lets check all names and alternative names if the requested window can be found + for (unsigned int i=0; i < controlledWindows.GetSize(); i++) + { + // convert to lowercase + compareName = controlledWindows[i].name; + compareName.Downcase(); + if (widgetStr == compareName) + { + // real window name was used, return it + return controlledWindows[i].name; + } + // now we check the alternative names of this window..these should be all lowercase already from ::PostSetup() + for (unsigned int j=0; j<controlledWindows[i].alternativeNames.GetSize(); j++) + { + if (widgetStr == controlledWindows[i].alternativeNames[j]) + { + // return the real window name + return controlledWindows[i].name; + } + } + } + // no window with that name found + return ""; +} + void pawsControlWindow::HandleQuit() { PawsManager::GetSingleton().CreateYesNoBox( "\nDo you really wish to leave Yliakum?", this ); Modified: trunk/src/client/gui/pawscontrolwindow.h =================================================================== --- trunk/src/client/gui/pawscontrolwindow.h 2014-11-30 06:24:35 UTC (rev 9665) +++ trunk/src/client/gui/pawscontrolwindow.h 2014-11-30 23:47:51 UTC (rev 9666) @@ -85,6 +85,58 @@ * @return TRUE if the toggle was possible, returns FALSE if it was not found. */ bool HandleWindowName(csString widgetStr); + + /** Used to show a window. + * If the window was already shown nothing happens. + * @param widgetStr: The window to show + * @return FALSE in case of an error otherwise TRUE + */ + bool showWindow(csString widgetStr); + /** Used to hide a window. + * If the window was already hidden nothing happens. + * @param widgetStr: The window to show + * @return FALSE in case of an error otherwise TRUE + */ + bool hideWindow(csString widgetStr); + /** Used to show a window from a command. + * If the window was already shown nothing happens. + * @param widgetStr: The window to hide (command form, translated to the actual window name by the function) + * @return FALSE in case of an error otherwise TRUE + */ + bool showWindowName(csString widgetStr); + /** Used to hide a window from a command. + * If the window was already hidden nothing happens. + * @param widgetStr: The window to hide (command form, translated to the actual window name by the function) + * @return FALSE in case of an error otherwise TRUE + */ + bool hideWindowName(csString widgetStr); + + /** Used to set the position of windows from a command. + * @param widgetStr: The window to hide (command form, translated to the actual window name by the function) + * @param x: New x postion ofthe window + * @param y: New y postion ofthe window + * @return FALSE in case of an error otherwise TRUE + */ + bool setWindowPositionName(csString widgetStr, int x, int y); + + /** Used to set the size of windows from a command. + * @param widgetStr: The window to resizehide (command form, translated to the actual window name by the function) + * @param width: New width of the window + * @param height: New height of the window + * @return FALSE in case of an error otherwise TRUE + */ + bool setWindowSizeName(csString widgetStr, int width, int height); + + /** Used to get all names and alternative names of windows from a command. + * @return a string containing all the window names + */ + csString getWindowNames(); + + /** Used to get the size and position of windows from a command. + * @param widgetStr: The window that should return its info or "all" + * @return a string containing the requested info + */ + csString getWindowInfo(csString widgetStr); /** When the quit button is pressed this method displays the yes/no dialog * box to confirm that a user really wants to quit. @@ -146,6 +198,20 @@ bool Contains( int x, int y ); private: + /** helper function for commands to translate to widget names from a more readable form + * This takes the windows names and the alternative names from a file (standard: /planeshift/data/gui/windownames.xml) + * and then returns the "offical" window name for the given parameter + * @param widgetStr: The widget name to be translated + * @return The actual widget name used by the system or an empty string if this widget is unknown to this function + */ + csString translateWidgetName(csString widgetStr); + struct WindowNames + { + csString name; + csArray<csString> alternativeNames; + }; // struct to contain the window names and their alternatives + csArray<WindowNames> controlledWindows; // array of all window names that are controllable by commands + unsigned short int style; bool hidden; csArray<WBName> wbs; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ral...@us...> - 2015-01-25 17:24:48
|
Revision: 9702 http://sourceforge.net/p/planeshift/code/9702 Author: ralphcampbell Date: 2015-01-25 17:24:46 +0000 (Sun, 25 Jan 2015) Log Message: ----------- Fix 6777 - add /groupleader command to change who is the group leader. Modified Paths: -------------- trunk/data/help.xml trunk/src/client/cmdgroups.cpp trunk/src/common/net/messages.cpp trunk/src/server/groupmanager.cpp trunk/src/server/groupmanager.h trunk/src/server/playergroup.h Modified: trunk/data/help.xml =================================================================== --- trunk/data/help.xml 2015-01-25 06:19:39 UTC (rev 9701) +++ trunk/data/help.xml 2015-01-25 17:24:46 UTC (rev 9702) @@ -1030,6 +1030,10 @@ Usage: /disband Disbands the current group.</content></Contents></topic> +<topic name="/groupleader"><Contents><content type="text">With this command you can change the group leader to another member of the group, provided you are the leader of the group. +Usage: +/groupleader [char-name] +Changes the group leader to the group member with the name [char-name].</content></Contents></topic> <topic name="/groupremove"><Contents><content type="text">With this command you can remove characters from a group, provided you are the leader of the group. Usage: /groupremove [char-name] Modified: trunk/src/client/cmdgroups.cpp =================================================================== --- trunk/src/client/cmdgroups.cpp 2015-01-25 06:19:39 UTC (rev 9701) +++ trunk/src/client/cmdgroups.cpp 2015-01-25 17:24:46 UTC (rev 9702) @@ -50,6 +50,7 @@ cmdsource->Subscribe("/groupmembers",this); // see list of members (optional level #) cmdsource->Subscribe("/groupchallenge",this);// challenges another group (leader only) cmdsource->Subscribe("/groupyield",this); //yields to all the groups in challenge (leader only) + cmdsource->Subscribe("/groupleader",this); //Change group leader (leader only) } psGroupCommands::~psGroupCommands() @@ -61,6 +62,7 @@ cmdsource->Unsubscribe("/groupmembers",this); cmdsource->Unsubscribe("/groupchallenge",this); cmdsource->Unsubscribe("/groupyield",this); + cmdsource->Unsubscribe("/groupleader",this); } const char *psGroupCommands::HandleCommand(const char *cmd) Modified: trunk/src/common/net/messages.cpp =================================================================== --- trunk/src/common/net/messages.cpp 2015-01-25 06:19:39 UTC (rev 9701) +++ trunk/src/common/net/messages.cpp 2015-01-25 17:24:46 UTC (rev 9702) @@ -1318,7 +1318,8 @@ WordArray words(message->GetStr()); command = words[0]; - if(command == "/invite" || command == "/groupremove" || command == "/groupchallenge") + if(command == "/invite" || command == "/groupremove" || + command == "/groupchallenge" || command == "/groupleader") { player = words[1]; return; @@ -1339,7 +1340,8 @@ csString msgtext; msgtext.AppendFmt("Command: '%s'", command.GetDataSafe()); - if(command == "/invite" || command == "/groupremove") + if(command == "/invite" || command == "/groupremove" || + command == "/groupchallenge" || command == "/groupleader") { msgtext.AppendFmt("Player: '%s'", player.GetDataSafe()); return msgtext; Modified: trunk/src/server/groupmanager.cpp =================================================================== --- trunk/src/server/groupmanager.cpp 2015-01-25 06:19:39 UTC (rev 9701) +++ trunk/src/server/groupmanager.cpp 2015-01-25 17:24:46 UTC (rev 9702) @@ -159,6 +159,16 @@ } } +void PlayerGroup::SetLeader(gemActor* member) +{ + // Swap enties in the members list to show leader at the top. + size_t inx = members.Find(member); + assert(inx != (size_t)-1); + members[inx] = leader; + members[0] = member; + leader = member; +} + void PlayerGroup::ListMembers(gemActor* client) { int clientnum = client->GetClientID(); @@ -383,6 +393,10 @@ { Yield(msg,client); } + else if(msg.command == "/groupleader") + { + Leader(msg,client->GetActor()); + } else { Error2("Group command %s is not supported by server.", msg.command.GetDataSafe()); @@ -628,7 +642,6 @@ psserver->groupmanager->HandleJoinGroup(this); } - void GroupManager::Disband(psGroupCmdMessage &msg,gemActor* client) { csRef<PlayerGroup> group = client->GetGroup(); @@ -651,6 +664,62 @@ psserver->SendSystemInfo(client->GetClientID(),"You have disbanded the group."); } +void GroupManager::Leader(psGroupCmdMessage &msg,gemActor* client) +{ + csRef<PlayerGroup> group = client->GetGroup(); + + if(!group) + { + psserver->SendSystemInfo(client->GetClientID(),"You are not in a group."); + return; + } + + if(!group->IsLeader(client)) + { + psserver->SendSystemError(client->GetClientID(), "Only the group leader can name a new leader."); + return; + } + + csString playerName = msg.player; + if(playerName.IsEmpty()) + { + psserver->SendSystemError(client->GetClientID(), "Please specify the player name to lead your group."); + return; + } + + playerName = NormalizeCharacterName(playerName); + + // Check to see if the player is changing leadership to him/herself. + if(playerName == client->GetName()) + { + psserver->SendSystemError(client->GetClientID(), "You are already the group leader."); + return; + } + + // Player must be online in order to be a group member. + Client* player = clients->Find(playerName); + + if(!player || !player->GetActor()) + { + psserver->SendSystemError(player->GetClientNum(),"%s is not a member of your group.", + playerName.GetData()); + return; + } + + csRef<PlayerGroup> playergroup = player->GetActor()->GetGroup(); + if(playergroup != group) + { + psserver->SendSystemError(player->GetClientNum(),"%s is not a member of your group.", + playerName.GetData()); + return; + } + + group->SetLeader(player->GetActor()); + group->BroadcastMemberList(); + + psserver->SendSystemInfo(client->GetClientID(),"You have transferred leadership of the group to %s.", playerName.GetData()); +} + PlayerGroup* GroupManager::FindGroup(int id) { // TODO: Change to hashmap Modified: trunk/src/server/groupmanager.h =================================================================== --- trunk/src/server/groupmanager.h 2015-01-25 06:19:39 UTC (rev 9701) +++ trunk/src/server/groupmanager.h 2015-01-25 17:24:46 UTC (rev 9702) @@ -79,6 +79,7 @@ void Leave(psGroupCmdMessage &msg,gemActor* client); void ListMembers(psGroupCmdMessage &msg,gemActor* client); void RemovePlayerFromGroup(psGroupCmdMessage &msg,gemActor* client); + void Leader(psGroupCmdMessage &msg,gemActor* client); /** Handles /groupchallenge and challenges another group after checking all requirements * are in order. Modified: trunk/src/server/playergroup.h =================================================================== --- trunk/src/server/playergroup.h 2015-01-25 06:19:39 UTC (rev 9701) +++ trunk/src/server/playergroup.h 2015-01-25 17:24:46 UTC (rev 9702) @@ -65,6 +65,9 @@ /// Remove a client from this group. void Remove(gemActor* member); + /// Change the leader of this group. + void SetLeader(gemActor* new_leader); + /** Add a new group to the list of those in duel with this. * * @param OtherGroup A pointer to the PlayerGroup we are adding in the duel groups. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ral...@us...> - 2015-03-14 22:31:17
|
Revision: 9732 http://sourceforge.net/p/planeshift/code/9732 Author: ralphcampbell Date: 2015-03-14 22:31:10 +0000 (Sat, 14 Mar 2015) Log Message: ----------- Use binary XML files by default. This speeds up psnpcclient startup considerably. Modified Paths: -------------- trunk/npcclient.cfg trunk/src/plugins/common/recast/celhpf.cpp Modified: trunk/npcclient.cfg =================================================================== --- trunk/npcclient.cfg 2015-03-14 16:09:34 UTC (rev 9731) +++ trunk/npcclient.cfg 2015-03-14 22:31:10 UTC (rev 9732) @@ -19,8 +19,8 @@ ; Document parser System.Plugins.iDocumentSystem = crystalspace.documentsystem.multiplexer -System.Plugins.iDocumentSystem.2 = crystalspace.documentsystem.binary -System.Plugins.iDocumentSystem.1 = crystalspace.documentsystem.tinyxml +System.Plugins.iDocumentSystem.1 = crystalspace.documentsystem.binary +System.Plugins.iDocumentSystem.2 = crystalspace.documentsystem.tinyxml ; Additional plugins ;System.Plugins.iPerfstat = crystalspace.utilities.perfstat Modified: trunk/src/plugins/common/recast/celhpf.cpp =================================================================== --- trunk/src/plugins/common/recast/celhpf.cpp 2015-03-14 16:09:34 UTC (rev 9731) +++ trunk/src/plugins/common/recast/celhpf.cpp 2015-03-14 22:31:10 UTC (rev 9732) @@ -1016,7 +1016,7 @@ bool celHNavStruct::SaveToFile (iVFS* vfs, const char* directory) { - csRef<iDocumentSystem> docsys = csLoadPluginCheck<iDocumentSystem>(objectRegistry, "crystalspace.documentsystem.tinyxml"); + csRef<iDocumentSystem> docsys = csLoadPluginCheck<iDocumentSystem>(objectRegistry, "crystalspace.documentsystem.multiplexer"); if (!docsys) { return false; @@ -1385,7 +1385,7 @@ iCelHNavStruct* celHNavStructBuilder::LoadHNavStruct (iVFS* vfs, const char* directory) { - csRef<iDocumentSystem> docsys = csLoadPluginCheck<iDocumentSystem>(objectRegistry, "crystalspace.documentsystem.tinyxml"); + csRef<iDocumentSystem> docsys = csLoadPluginCheck<iDocumentSystem>(objectRegistry, "crystalspace.documentsystem.multiplexer"); if (!docsys) { return 0; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <ral...@us...> - 2015-03-17 05:46:26
|
Revision: 9738 http://sourceforge.net/p/planeshift/code/9738 Author: ralphcampbell Date: 2015-03-17 05:46:17 +0000 (Tue, 17 Mar 2015) Log Message: ----------- Fix 6685 - NPC crash in the arena when unable to reach the target Modified Paths: -------------- trunk/include/tools/celhpf.h trunk/src/npcclient/npcoperations.cpp trunk/src/plugins/common/recast/celhpf.cpp trunk/src/plugins/common/recast/celhpf.h Modified: trunk/include/tools/celhpf.h =================================================================== --- trunk/include/tools/celhpf.h 2015-03-17 04:46:01 UTC (rev 9737) +++ trunk/include/tools/celhpf.h 2015-03-17 05:46:17 UTC (rev 9738) @@ -52,11 +52,11 @@ /// Check if the path can be transversed backward from the current position. virtual bool HasPrevious () const = 0; - /// Get next node. - virtual iMapNode* Next () = 0; + /// Get next node. Note that the reference needs to be released. + virtual csPtr<iMapNode> Next () = 0; - /// Get previous node. - virtual iMapNode* Previous () = 0; + /// Get previous node. Note that the reference needs to be released. + virtual csPtr<iMapNode> Previous () = 0; /// Get current node. virtual iMapNode* Current () = 0; Modified: trunk/src/npcclient/npcoperations.cpp =================================================================== --- trunk/src/npcclient/npcoperations.cpp 2015-03-17 04:46:01 UTC (rev 9737) +++ trunk/src/npcclient/npcoperations.cpp 2015-03-17 05:46:17 UTC (rev 9738) @@ -241,14 +241,14 @@ csString collision = GetCollisionPerception(npc); if(!collision.IsEmpty()) { - NPCDebug(npc, 5, "Sending collition perception: " + collision); + NPCDebug(npc, 5, "Sending collision perception: " + collision); Perception perception(collision); npc->TriggerEvent(&perception); } else { - NPCDebug(npc, 6, "No collition perception to send."); + NPCDebug(npc, 6, "No collision perception to send."); } } @@ -685,6 +685,7 @@ if(!GetEndPosition(npc, myPos, mySector, endPos, endSector)) { NPCDebug(npc, 5, "Failed to find target position!"); + StopMovement(npc); return OPERATION_FAILED; // This operation is complete } @@ -692,6 +693,7 @@ if(distance < 0.5) { NPCDebug(npc, 5, "We are done.."); + StopMovement(npc); return OPERATION_COMPLETED; } path = npcclient->ShortestPath(npc, myPos,mySector,endPos,endSector); @@ -702,16 +704,19 @@ toString(myPos, mySector).GetData(), toString(endPos, endSector).GetData()); + StopMovement(npc); return OPERATION_FAILED; // This operation is complete } else if(!PathReachedEndPoint(npc, path, endPos, endSector)) { + StopMovement(npc); return OPERATION_FAILED; } - else if(path->GetDistance() < 0.5) // Distance allready adjusted for offset + else if(path->GetDistance() < 0.5) // Distance already adjusted for offset { NPCDebug(npc, 5, "We are done..."); + StopMovement(npc); return OPERATION_COMPLETED; // This operation is complete } else if(GetAngularVelocity(npc) > 0 || GetVelocity(npc) > 0) @@ -719,7 +724,7 @@ float dummyAngle; // Find next local destination and start moving towards local destination - iMapNode* dest = path->Next(); + csRef<iMapNode> dest = path->Next(); StartMoveTo(npc, dest->GetPosition(), dest->GetSector(), GetVelocity(npc), action, dummyAngle); currentDistance = npcclient->GetWorld()->Distance2(myPos, mySector, @@ -730,10 +735,9 @@ else { // Have no velocity to complete any movement + StopMovement(npc); return OPERATION_FAILED; } - - return OPERATION_COMPLETED; // This operation is complete } ScriptOperation::OperationResult MovementOperation::Advance(float timedelta, NPC* npc) @@ -754,98 +758,105 @@ } // Check if path endpoint has changed and needs to be updated + float distance; + csRef<iMapNode> dest; if(EndPointChanged(endPos, endSector)) { NPCDebug(npc, 8, "target diverged, recalculate path between %s and %s", toString(myPos, mySector).GetData(), toString(endPos, endSector).GetData()); + // Let's check if we are at the end position. The ShortestPath doesn't + // seems to work to well if the start and end is the same. + distance = npcclient->GetWorld()->Distance2(myPos, mySector, endPos, endSector); + if(distance < 0.5) + { + NPCDebug(npc, 5, "We are done...."); + StopMovement(npc); + return OPERATION_COMPLETED; + } path = npcclient->ShortestPath(npc, myPos, mySector, endPos, endSector); if(!path || !path->HasNext()) { - // Lets check if we are at the end position. The ShortestPath dosn't - // seams to work to well if the start and end is the same. - float distance = npcclient->GetWorld()->Distance2(myPos, mySector, endPos, endSector); - if(distance < 0.5) - { - NPCDebug(npc, 5, "We are done...."); - StopMovement(npc); - return OPERATION_COMPLETED; - } - else - { - // We really failed to find a path between us and the target - NPCDebug(npc, 5, "Failed to find a path between %s and %s", - toString(myPos, mySector).GetData(), - toString(endPos, endSector).GetData()); - StopMovement(npc); - return OPERATION_FAILED; - } + // We really failed to find a path between us and the target + NPCDebug(npc, 5, "Failed to find a path between %s and %s", + toString(myPos, mySector).GetData(), + toString(endPos, endSector).GetData()); + StopMovement(npc); + return OPERATION_FAILED; } - - if(!PathReachedEndPoint(npc, path, endPos, endSector)) + else if(!PathReachedEndPoint(npc, path, endPos, endSector)) { StopMovement(npc); return OPERATION_FAILED; } + else if(path->GetDistance() < 0.5) // Distance already adjusted for offset + { + NPCDebug(npc, 5, "We are done..."); + StopMovement(npc); + return OPERATION_COMPLETED; // This operation is complete + } + // Start moving toward new dest - iMapNode* dest = path->Next(); + dest = path->Next(); StartMoveTo(npc, dest->GetPosition(), dest->GetSector(), GetVelocity(npc), action, angle); - currentDistance = npcclient->GetWorld()->Distance2(myPos, mySector, + currentDistance = npcclient->GetWorld()->Distance2(myPos, mySector, dest->GetPosition(), dest->GetSector()); } - - iMapNode* dest = path->Current(); - float distance = npcclient->GetWorld()->Distance2(myPos,mySector,dest->GetPosition(),dest->GetSector()); - if(distance >= INFINITY_DISTANCE) + else { - NPCDebug(npc, 5, "No connection found.."); - StopMovement(npc); - return OPERATION_FAILED; - } - else if(distance <= 0.5f || distance > (currentDistance+0.001)) - { - if(distance > (currentDistance+0.001)) + dest = path->Current(); + distance = npcclient->GetWorld()->Distance2(myPos,mySector,dest->GetPosition(),dest->GetSector()); + if(distance >= INFINITY_DISTANCE) { - NPCDebug(npc, 6, "We passed localDest(dist=%.4f > curr=%.4f)...", distance, currentDistance); + NPCDebug(npc, 5, "No connection found.."); + StopMovement(npc); + return OPERATION_FAILED; } - else + else if(distance <= 0.5f || distance > (currentDistance+0.001)) { - NPCDebug(npc, 6, "We are at localDest(dist=%.4f)...", distance); - } + if(distance > (currentDistance+0.001)) + { + NPCDebug(npc, 6, "We passed localDest(dist=%.4f > curr=%.4f)...", distance, currentDistance); + } + else + { + NPCDebug(npc, 6, "We are at localDest(dist=%.4f)...", distance); + } - if(!path->HasNext()) - { - NPCDebug(npc, 5, "We are done....."); - StopMovement(npc); - if(CheckEndPointOk(npc, myPos, mySector, endPos, endSector)) + if(!path->HasNext()) { - return OPERATION_COMPLETED; + NPCDebug(npc, 5, "We are done....."); + StopMovement(npc); + if(CheckEndPointOk(npc, myPos, mySector, endPos, endSector)) + { + return OPERATION_COMPLETED; + } + else + { + return OPERATION_FAILED; + } } else { - return OPERATION_FAILED; + dest = path->Next(); + if(dest == NULL) + { + NPCDebug(npc, 5, "DEST PATH == NULL."); + return OPERATION_NOT_COMPLETED; + } + NPCDebug(npc, 5, "DEST PATH is good."); + StartMoveTo(npc, dest->GetPosition(), dest->GetSector(), GetVelocity(npc), action, angle); + currentDistance = npcclient->GetWorld()->Distance2(myPos, mySector, dest->GetPosition(), dest->GetSector()); } } else { - dest = path->Next(); - if( dest==NULL ) - { - NPCDebug(npc, 5, "DEST PATH == NULL."); - return OPERATION_NOT_COMPLETED; - } - NPCDebug(npc, 5, "DEST PATH is good."); - StartMoveTo(npc, dest->GetPosition(), dest->GetSector(), GetVelocity(npc), action, angle); - currentDistance = npcclient->GetWorld()->Distance2(myPos, mySector, dest->GetPosition(), dest->GetSector()); + TurnTo(npc, dest->GetPosition(), dest->GetSector(), forward, angle); } } - else - { - TurnTo(npc, dest->GetPosition(), dest->GetSector(), forward, angle); - } // Limit time extrapolation so we arrive near the correct place. float close = GetVelocity(npc)*timedelta; @@ -916,7 +927,7 @@ { if(npc->GetTarget()) { - NPCDebug(npc, 5, "Queing Assement operation to server for %s",npc->GetTarget()->GetName()); + NPCDebug(npc, 5, "Queuing Assement operation to server for %s",npc->GetTarget()->GetName()); npcclient->GetNetworkMgr()->QueueAssessCommand(npc->GetActor(), npc->GetTarget(), psGameObject::ReplaceNPCVariables(npc, physicalAssessmentPerception), @@ -925,7 +936,7 @@ } else { - NPCDebug(npc, 5, "No target to Queing Assement operation for."); + NPCDebug(npc, 5, "No target to Queuing Assement operation for."); } return OPERATION_COMPLETED; // Nothing more to do for this op. @@ -1437,7 +1448,7 @@ { float dummyRange; - // Switch target if a new entity is withing search range. + // Switch target if a new entity is within search range. gemNPCActor* newTarget = npc->GetNearestPlayer(searchRange, targetPos, targetSector, dummyRange); if(newTarget) @@ -1465,7 +1476,7 @@ { float dummyRange; - // Switch target if a new entity is withing search range. + // Switch target if a new entity is within search range. gemNPCActor* newTarget = npc->GetNearestActor(searchRange, targetPos, targetSector, dummyRange); if(newTarget) Modified: trunk/src/plugins/common/recast/celhpf.cpp =================================================================== --- trunk/src/plugins/common/recast/celhpf.cpp 2015-03-17 04:46:01 UTC (rev 9737) +++ trunk/src/plugins/common/recast/celhpf.cpp 2015-03-17 05:46:17 UTC (rev 9738) @@ -35,12 +35,12 @@ : scfImplementationType (this), navMeshes(navmeshes) { reverse = false; - debugMeshes = new csArray<csSimpleRenderMesh*>(); + debugMeshes = 0; } celHPath::~celHPath () { - if (!debugMeshes->IsEmpty()) + if (debugMeshes) { csArray<csSimpleRenderMesh*>::Iterator it = debugMeshes->GetIterator(); while (it.HasNext()) @@ -49,14 +49,14 @@ delete [] mesh->vertices; delete [] mesh->colors; } - debugMeshes->DeleteAll(); + delete debugMeshes; } - delete debugMeshes; } void celHPath::Initialize(iCelPath* highLevelPath) { hlPath = highLevelPath; + size_t llSize = 0; // calculate path length { @@ -67,20 +67,20 @@ iMapNode* dst = hlPath->Next(); while(1) { - // cross-sector connections are coincident + // cross-sector connections are coincident so + // only count distance within a sector. if(src->GetSector() == dst->GetSector()) { length += (dst->GetPosition()-src->GetPosition()).Norm(); + llSize++; } - if(hlPath->HasNext()) + + if(!hlPath->HasNext()) { - src = hlPath->Next(); - dst = hlPath->Next(); - } - else - { break; } + src = dst; + dst = hlPath->Next(); } // restart path for traversal @@ -91,54 +91,38 @@ firstNode = hlPath->GetFirst(); lastNode = hlPath->GetLast(); - // Resize low level path array. High level paths always have two nodes for each segment of the + // Resize low level path array. + // High level paths always have two nodes for each segment of the // path in a sector (entry and exit point). - size_t llSize = hlPath->GetNodeCount() / 2; llPaths.SetSize(llSize); currentllPosition = 0; // Construct first part of the low level path - csRef<iMapNode> goal = hlPath->Next(); + iMapNode* goal = hlPath->Next(); currentSector = firstNode->GetSector(); csRef<iCelNavMesh> navMesh = navMeshes.Get(currentSector, 0); - csRef<iCelNavMeshPath> path = navMesh->ShortestPath(firstNode->GetPosition(), goal->GetPosition()); - llPaths[0] = path; + llPaths[0] = navMesh->ShortestPath(firstNode->GetPosition(), goal->GetPosition()); // Set current node currentNode = firstNode; } -bool celHPath::HasNextInternal (bool reverse) const +bool celHPath::HasNextInternal (bool rev) const { - if(reverse) + if(!llPaths[currentllPosition].IsValid()) { - if(llPaths[currentllPosition].IsValid()) - { - if(llPaths[currentllPosition]->HasPrevious() || currentllPosition > 0) - { - return true; - } - } - else - { - return true; - } + return true; } + if(rev) + { + return llPaths[currentllPosition]->HasPrevious() || + currentllPosition > 0; + } else { - if(llPaths[currentllPosition].IsValid()) - { - if(llPaths[currentllPosition]->HasNext() || currentllPosition + 1 < llPaths.GetSize()) - { - return true; - } - } - else - { - return true; - } + return llPaths[currentllPosition]->HasNext() || + currentllPosition + 1 < llPaths.GetSize(); } - return false; } bool celHPath::HasNext () const @@ -151,41 +135,34 @@ return HasNextInternal(!reverse); } -iMapNode* celHPath::NextInternal (bool reverse) +csPtr<iMapNode> celHPath::NextInternal (bool rev) { - while(HasNextInternal(reverse)) + while(HasNextInternal(rev)) { if(!llPaths[currentllPosition].IsValid()) { - csRef<iMapNode> src; - csRef<iMapNode> dst; - if(reverse) + iMapNode* dst; + if(rev) { - src = hlPath->Previous(); dst = hlPath->Previous(); } else { dst = hlPath->Next(); - src = hlPath->Next(); } - csRef<iMapNode> target = reverse ? src : dst; - currentSector = target->GetSector(); - - if(src->GetSector() != dst->GetSector()) + if(currentNode->GetSector() != dst->GetSector()) { // cross-sector steps are coincident - currentNode = csPtr<iMapNode>(new csMapNode("")); - currentNode->SetPosition(target->GetPosition()); - currentNode->SetSector(currentSector); - return currentNode; + csVector3 pos(dst->GetPosition()); + currentNode = dst; + currentSector = dst->GetSector(); } else { csRef<iCelNavMesh> navMesh = navMeshes.Get(currentSector, 0); - llPaths[currentllPosition] = navMesh->ShortestPath(src->GetPosition(), dst->GetPosition()); - if(reverse) + llPaths[currentllPosition] = navMesh->ShortestPath(currentNode->GetPosition(), dst->GetPosition()); + if(rev) { while(llPaths[currentllPosition]->HasNext()) { @@ -196,16 +173,16 @@ CS_ASSERT(llPaths[currentllPosition].IsValid()); } } - else if((!reverse && !llPaths[currentllPosition]->HasNext()) - || (reverse && !llPaths[currentllPosition]->HasPrevious())) + else if((!rev && !llPaths[currentllPosition]->HasNext()) + || (rev && !llPaths[currentllPosition]->HasPrevious())) { advanced += llPaths[currentllPosition]->Length(); - currentllPosition += reverse ? -1 : 1; + currentllPosition += rev ? -1 : 1; } else { csVector3 position; - if(reverse) + if(rev) { llPaths[currentllPosition]->Previous(position); } @@ -214,7 +191,7 @@ llPaths[currentllPosition]->Next(position); } - currentNode = csPtr<iMapNode>(new csMapNode("")); + currentNode.AttachNew(new csMapNode("")); currentNode->SetPosition(position); currentNode->SetSector(currentSector); @@ -225,12 +202,12 @@ return 0; } -iMapNode* celHPath::Next () +csPtr<iMapNode> celHPath::Next () { return NextInternal(reverse); } -iMapNode* celHPath::Previous () +csPtr<iMapNode> celHPath::Previous () { return NextInternal(!reverse); } @@ -265,9 +242,27 @@ void celHPath::Restart () { - while(HasNextInternal(reverse)) + currentNode = GetFirst(); + currentSector = currentNode->GetSector(); + currentllPosition = 0; + for(size_t i = 0; i < llPaths.GetSize(); i++) + if(llPaths[i]) + llPaths[i]->Restart(); + if(reverse) { - NextInternal(reverse); + if(llPaths.GetSize() > 1) + { + currentllPosition = llPaths.GetSize() - 1; + llPaths[currentllPosition].Invalidate(); + } + else + { + while(llPaths[currentllPosition]->HasNext()) + { + csVector3 pos; + llPaths[currentllPosition]->Next(pos); + } + } } // reset travelled distance @@ -324,7 +319,8 @@ dd.vertex(currentPosition[0], currentPosition[1] + halfHeight, currentPosition[2], vertexCol); while (HasNext()) { - currentPosition = Next()->GetPosition(); + csRef<iMapNode> next = Next(); + currentPosition = next->GetPosition(); dd.vertex(currentPosition[0], currentPosition[1] + halfHeight, currentPosition[2], vertexCol); } dd.end(); @@ -333,12 +329,12 @@ Restart(); for (int i = 0; i < backCount; i++) { - Next(); + csRef<iMapNode> next = Next(); } // Clear previous meshes - if (!debugMeshes->IsEmpty()) + if (debugMeshes) { csArray<csSimpleRenderMesh*>::Iterator it = debugMeshes->GetIterator(); while (it.HasNext()) @@ -347,7 +343,7 @@ delete [] mesh->vertices; delete [] mesh->colors; } - debugMeshes->DeleteAll(); + delete debugMeshes; } // Update meshes @@ -365,12 +361,11 @@ { this->objectRegistry = objectRegistry; parameters.AttachNew(params->Clone()); - debugMeshes = new csArray<csSimpleRenderMesh*>(); + debugMeshes = 0; } celHNavStruct::~celHNavStruct () { - debugMeshes->Empty(); delete debugMeshes; } @@ -549,6 +544,7 @@ sector->QueryObject()->GetName()); continue; } + csVector3 box = parameters->GetPolygonSearchBox(); csArray<csRef<iCelNode> > sectorNodes = nodes.GetAll(sector); int size = sectorNodes.GetSize(); for (int i = 0; i < size - 1; i++) @@ -563,7 +559,6 @@ { csVector3 last; path->GetLast(last); - csVector3 box = parameters->GetPolygonSearchBox(); // Check if last calculated point is within reach of the last given point if (ABS(last[0] - node2->GetPosition()[0]) <= box[0] && ABS(last[1] - node2->GetPosition()[1]) <= box[1] && @@ -611,7 +606,7 @@ * Finding the shortest path in a navigation structure is done in two steps: * 1- Add the origin and destination points of the path to the high level graph, and connect * them to edges in their sectors. Then, find a path in this graph. - * 2- For each two adjascent nodes in the high level path, find the corresponding low level + * 2- For each two adjacent nodes in the high level path, find the corresponding low level * path between those points, using the navigation mesh for their sector. * After that, the nodes and edges that were added to the graph can be removed. */ @@ -635,8 +630,12 @@ hlGraph->RemoveNode(goalNodeIdx); return 0; } - csList<csRef<iCelNode> > tmpEdgesOrigins; // Only for edges from some node to goal node - csList<size_t> tmpEdgesIndices; + // Save edges added to the graph so we can remove them after finding the path. + csArray<iCelNode*> tmpEdgesOriginsF; + csArray<size_t> tmpEdgesIndicesF; + csArray<iCelNode*> tmpEdgesOriginsB; + csArray<size_t> tmpEdgesIndicesB; + csVector3 box = parameters->GetPolygonSearchBox(); size_t size = hlGraph->GetNodeCount(); for (size_t i = 0; i < size; i++) { @@ -655,13 +654,13 @@ { csVector3 last; tmpPath->GetLast(last); - csVector3 box = parameters->GetPolygonSearchBox(); // Check if last calculated point is within reach of the last given point if (ABS(last[0] - node->GetPosition()[0]) <= box[0] && ABS(last[1] - node->GetPosition()[1]) <= box[1] && ABS(last[2] - node->GetPosition()[2]) <= box[2]) { - hlGraph->AddEdge(fromNode, node, true, tmpPath->Length()); + tmpEdgesOriginsF.Push(fromNode); + tmpEdgesIndicesF.Push(hlGraph->AddEdge(fromNode, node, true, tmpPath->Length())); } } } @@ -673,14 +672,13 @@ { csVector3 last; tmpPath->GetLast(last); - csVector3 box = parameters->GetPolygonSearchBox(); // Check if last calculated point is within reach of the last given point if (ABS(last[0] - goalNode->GetPosition()[0]) <= box[0] && ABS(last[1] - goalNode->GetPosition()[1]) <= box[1] && ABS(last[2] - goalNode->GetPosition()[2]) <= box[2]) { - tmpEdgesOrigins.PushBack(node); - tmpEdgesIndices.PushBack(hlGraph->AddEdge(node, goalNode, true, tmpPath->Length())); + tmpEdgesOriginsB.Push(node); + tmpEdgesIndicesB.Push(hlGraph->AddEdge(node, goalNode, true, tmpPath->Length())); } } } @@ -693,46 +691,42 @@ { csVector3 last; tmpPath->GetLast(last); - csVector3 box = parameters->GetPolygonSearchBox(); // Check if last calculated point is within reach of the last given point if (ABS(last[0] - goalNode->GetPosition()[0]) <= box[0] && ABS(last[1] - goalNode->GetPosition()[1]) <= box[1] && ABS(last[2] - goalNode->GetPosition()[2]) <= box[2]) { - hlGraph->AddEdge(fromNode, goalNode, true, tmpPath->Length()); + tmpEdgesOriginsF.Push(fromNode); + tmpEdgesIndicesF.Push(hlGraph->AddEdge(fromNode, goalNode, true, tmpPath->Length())); } } } // Find path in high level graph + bool found = false; csRef<iCelPath> hlPath = scfCreateInstance<iCelPath>("cel.celpath"); - if (!hlPath) + if (hlPath) { - csList<size_t>::Iterator itIndices(tmpEdgesIndices); - csList<csRef<iCelNode> >::Iterator itOrigins(tmpEdgesOrigins); - while (itIndices.HasNext()) // No need to check both iterators, since they have the same element count - { - hlGraph->RemoveEdge(itOrigins.Next(), itIndices.Next()); - } - hlGraph->RemoveNode(fromNodeIdx); - hlGraph->RemoveNode(goalNodeIdx); - return 0; + found = hlGraph->ShortestPath2(fromNode, goalNode, hlPath); } - hlGraph->ShortestPath2(fromNode, goalNode, hlPath); - // Remove edges that connect any node to the goal node - csList<size_t>::Iterator itIndices(tmpEdgesIndices); - csList<csRef<iCelNode> >::Iterator itOrigins(tmpEdgesOrigins); - while (itIndices.HasNext()) // No need to check both iterators, since they have the same element count + // Remove edges that were added temporarily. + size = tmpEdgesIndicesF.GetSize(); + for (size_t i = 0; i < size; i++) { - hlGraph->RemoveEdge(itOrigins.Next(), itIndices.Next()); + hlGraph->RemoveEdge(tmpEdgesOriginsF[i], tmpEdgesIndicesF[i]); } + size = tmpEdgesIndicesB.GetSize(); + for (size_t i = 0; i < size; i++) + { + hlGraph->RemoveEdge(tmpEdgesOriginsB[i], tmpEdgesIndicesB[i]); + } - // Remove from and goal nodes from the high level graph (and the edges we added and didn't explicitly remove) + // Remove from and goal nodes from the high level graph. hlGraph->RemoveNode(goalNodeIdx); hlGraph->RemoveNode(fromNodeIdx); - if (hlPath->GetNodeCount() == 0) + if (!found || hlPath->GetNodeCount() <= 1) { return 0; } @@ -791,6 +785,7 @@ sameSectorSize++; } } + csVector3 box = parameters->GetPolygonSearchBox(); for (int i = 0; i < sameSectorSize; ++i) { csRef<iCelNode> node = sameSectorNodes[i]; @@ -810,7 +805,6 @@ { csVector3 last; path->GetLast(last); - csVector3 box = parameters->GetPolygonSearchBox(); // Check if last calculated point is within reach of the last given point if (ABS(last[0] - node2->GetPosition()[0]) <= box[0] && ABS(last[1] - node2->GetPosition()[1]) <= box[1] && @@ -851,7 +845,6 @@ { csVector3 last; path->GetLast(last); - csVector3 box = parameters->GetPolygonSearchBox(); // Check if last calculated point is within reach of the last given point if (ABS(last[0] - node2->GetPosition()[0]) <= box[0] && ABS(last[1] - node2->GetPosition()[1]) <= box[1] && @@ -1023,7 +1016,10 @@ } csString workingDir(vfs->GetCwd()); - vfs->ChDir(directory); + if (!vfs->ChDir(directory)) + { + return false; + } // Create XML file csRef<iDocument> doc = docsys->CreateDocument(); @@ -1052,7 +1048,10 @@ // Write xml file const char* log = doc->Write(vfs, "navstruct.xml"); - vfs->ChDir(workingDir.GetDataSafe()); + if (!vfs->ChDir(workingDir.GetDataSafe())) + { + return false; + } vfs->Sync(); if (log) @@ -1077,7 +1076,10 @@ return nm->GetDebugMeshes (); } - debugMeshes->Empty(); + if (debugMeshes) + debugMeshes->Empty(); + else + debugMeshes = new csArray<csSimpleRenderMesh*>(); // Copy meshes from all navMeshes csHash<csRef<iCelNavMesh>, csPtrKey<iSector> >::GlobalIterator it = navMeshes.GetIterator(); @@ -1315,6 +1317,7 @@ csString msg; msg.Format("invalid sector %s in navmesh\n", sectorName); CS_ASSERT_MSG(msg.GetData(),false); + return false; } } @@ -1330,7 +1333,7 @@ return true; } -bool celHNavStructBuilder::ParseGraph (iDocumentNode* node, iCelGraph* graph, csHash<csRef<iSector>, const char*> sectors) +bool celHNavStructBuilder::ParseGraph (iDocumentNode* node, iCelGraph* graph, csHash<csRef<iSector>, const char*>& sectors) { csRef<iDocumentNode> nodesNode = node->GetNode("nodes"); csRef<iDocumentNodeIterator> it = nodesNode->GetNodes("node"); @@ -1350,6 +1353,7 @@ csString msg; msg.Format("invalid sector %s in navmesh graph node\n", sectorName); CS_ASSERT_MSG(msg.GetData(),false); + return false; } // Get position Modified: trunk/src/plugins/common/recast/celhpf.h =================================================================== --- trunk/src/plugins/common/recast/celhpf.h 2015-03-17 04:46:01 UTC (rev 9737) +++ trunk/src/plugins/common/recast/celhpf.h 2015-03-17 05:46:17 UTC (rev 9738) @@ -61,8 +61,8 @@ float length; float advanced; - virtual bool HasNextInternal (bool reverse) const; - virtual iMapNode* NextInternal (bool reverse); + virtual bool HasNextInternal (bool rev) const; + virtual csPtr<iMapNode> NextInternal (bool rev); public: celHPath (csHash<csRef<iCelNavMesh>, csPtrKey<iSector> >& navMeshes); @@ -73,8 +73,8 @@ // API virtual bool HasNext () const; virtual bool HasPrevious () const; - virtual iMapNode* Next (); - virtual iMapNode* Previous (); + virtual csPtr<iMapNode> Next (); + virtual csPtr<iMapNode> Previous (); virtual iMapNode* Current (); virtual iMapNode* GetFirst (); virtual iMapNode* GetLast (); @@ -146,7 +146,7 @@ bool ParseParameters (iDocumentNode* node, iCelNavMeshParams* params); bool ParseMeshes (iDocumentNode* node, csHash<csRef<iSector>, const char*>& sectors, celHNavStruct* navStruct, iVFS* vfs, iCelNavMeshParams* params); - bool ParseGraph (iDocumentNode* node, iCelGraph* graph, csHash<csRef<iSector>, const char*> sectors); + bool ParseGraph (iDocumentNode* node, iCelGraph* graph, csHash<csRef<iSector>, const char*>& sectors); public: celHNavStructBuilder (iBase* parent); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <wha...@us...> - 2015-07-27 20:46:48
|
Revision: 9748 http://sourceforge.net/p/planeshift/code/9748 Author: whacko88 Date: 2015-07-27 20:46:45 +0000 (Mon, 27 Jul 2015) Log Message: ----------- Bumped ps version to 0.6.4 Modified Paths: -------------- trunk/configure.ac trunk/src/common/util/pscssetup.h Modified: trunk/configure.ac =================================================================== --- trunk/configure.ac 2015-06-09 20:47:40 UTC (rev 9747) +++ trunk/configure.ac 2015-07-27 20:46:45 UTC (rev 9748) @@ -11,7 +11,7 @@ #---------------------------------------------------------------------------- # Initialize autoconf #---------------------------------------------------------------------------- -AC_INIT([PlaneShift], [0.6.3], [http://www.hydlaaplaza.com/flyspray/]) +AC_INIT([PlaneShift], [0.6.4], [http://www.hydlaaplaza.com/flyspray/]) CS_PACKAGEINFO([PlaneShift a 3d MMORPG], [Copyright (C)2001-2013 Atomic Blue], [http://www.planeshift.it/]) Modified: trunk/src/common/util/pscssetup.h =================================================================== --- trunk/src/common/util/pscssetup.h 2015-06-09 20:47:40 UTC (rev 9747) +++ trunk/src/common/util/pscssetup.h 2015-07-27 20:46:45 UTC (rev 9748) @@ -35,7 +35,7 @@ * @{ */ #ifndef PS_VERSION -#define PS_VERSION "0.6.3" +#define PS_VERSION "0.6.4" #endif #ifndef APPNAME This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <tua...@us...> - 2015-07-28 13:52:31
|
Revision: 9749 http://sourceforge.net/p/planeshift/code/9749 Author: tuathanach Date: 2015-07-28 13:52:29 +0000 (Tue, 28 Jul 2015) Log Message: ----------- Set to PS Version 0.6.5 Modified Paths: -------------- trunk/configure.ac trunk/src/common/util/pscssetup.h Modified: trunk/configure.ac =================================================================== --- trunk/configure.ac 2015-07-27 20:46:45 UTC (rev 9748) +++ trunk/configure.ac 2015-07-28 13:52:29 UTC (rev 9749) @@ -11,7 +11,7 @@ #---------------------------------------------------------------------------- # Initialize autoconf #---------------------------------------------------------------------------- -AC_INIT([PlaneShift], [0.6.4], [http://www.hydlaaplaza.com/flyspray/]) +AC_INIT([PlaneShift], [0.6.5], [http://www.hydlaaplaza.com/flyspray/]) CS_PACKAGEINFO([PlaneShift a 3d MMORPG], [Copyright (C)2001-2013 Atomic Blue], [http://www.planeshift.it/]) Modified: trunk/src/common/util/pscssetup.h =================================================================== --- trunk/src/common/util/pscssetup.h 2015-07-27 20:46:45 UTC (rev 9748) +++ trunk/src/common/util/pscssetup.h 2015-07-28 13:52:29 UTC (rev 9749) @@ -35,7 +35,7 @@ * @{ */ #ifndef PS_VERSION -#define PS_VERSION "0.6.4" +#define PS_VERSION "0.6.5" #endif #ifndef APPNAME This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <lpa...@us...> - 2018-07-01 13:27:33
|
Revision: 10002 http://sourceforge.net/p/planeshift/code/10002 Author: lpancallo Date: 2018-07-01 13:27:25 +0000 (Sun, 01 Jul 2018) Log Message: ----------- Small documentation updates Modified Paths: -------------- trunk/src/client/globals.h trunk/src/common/util/location.cpp trunk/src/common/util/location.h trunk/src/common/util/psconst.h trunk/src/npcclient/globals.h trunk/src/npcclient/networkmgr.cpp trunk/src/npcclient/npcbehave.cpp trunk/src/npcclient/npcclient.cpp trunk/src/npcclient/npcoperations.cpp trunk/src/npcclient/perceptions.h trunk/src/server/adminmanager.cpp trunk/src/server/bulkobjects/servervitals.cpp trunk/src/server/gem.h trunk/src/server/npcmanager.cpp trunk/src/server/psserver.cpp trunk/src/server/weathermanager.cpp trunk/src/server/workmanager.cpp trunk/vfs.cfg Modified: trunk/src/client/globals.h =================================================================== --- trunk/src/client/globals.h 2018-04-30 11:45:31 UTC (rev 10001) +++ trunk/src/client/globals.h 2018-07-01 13:27:25 UTC (rev 10002) @@ -18,7 +18,7 @@ */ /* This file holds definitions for ALL global variables in the planeshift - * server, normally you should move global variables into the psServer class + * client, normally you should move global variables into the psServer class */ #ifndef __GLOBALS_H__ #define __GLOBALS_H__ Modified: trunk/src/common/util/location.cpp =================================================================== --- trunk/src/common/util/location.cpp 2018-04-30 11:45:31 UTC (rev 10001) +++ trunk/src/common/util/location.cpp 2018-07-01 13:27:25 UTC (rev 10002) @@ -620,7 +620,7 @@ } // Load region with same master location type - Result rs2(db->Select("select loc.*,s.name as sector from sc_locations loc, sectors s where loc.loc_sector_id = s.id and type_id = %d and id_prev_loc_in_region > 0",id)); // Only load regions, locations has been loaded allready + Result rs2(db->Select("select loc.*,s.name as sector from sc_locations loc, sectors s where loc.loc_sector_id = s.id and type_id = %d and id_prev_loc_in_region > 0",id)); // Only load regions, locations has been loaded already csArray<Location*> tmpLocs; Modified: trunk/src/common/util/location.h =================================================================== --- trunk/src/common/util/location.h 2018-04-30 11:45:31 UTC (rev 10001) +++ trunk/src/common/util/location.h 2018-07-01 13:27:25 UTC (rev 10002) @@ -373,15 +373,21 @@ */ Location* GetLocation(int index); - /** Find a region by name. + /** Find a region with a given name. + * This function handles the searching for the specified region name + * so that other functions can refer to the region directly. */ LocationType* FindRegion(const char* regname); - /** Find a location type by name + /** Find a location with a given name. + * This function handles the searching for the specified location type + * so that other functions can refer to the location type directly. */ LocationType* FindLocation(const char* typeName); - /** Find a location of a specfic location type by nam. + /** + * This function handles the searching for the specified object + * type and basically does the work for the \<locate\> script command. */ Location* FindLocation(const char* typeName, const char* name); Modified: trunk/src/common/util/psconst.h =================================================================== --- trunk/src/common/util/psconst.h 2018-04-30 11:45:31 UTC (rev 10001) +++ trunk/src/common/util/psconst.h 2018-07-01 13:27:25 UTC (rev 10002) @@ -97,8 +97,8 @@ #define IS_CONTAINER true -#define GAME_MINUTE_IN_SECONDS 10 ///< Number of seconds for each game minute, 10sec real time for 1 minute game time -#define GAME_MINUTE_IN_TICKS (GAME_MINUTE_IN_SECONDS*1000) ///< Number of ticks for each game minute, 10sec real time for 1 minute game time +#define GAME_MINUTE_IN_SECONDS 10 ///< Number of seconds for each game minute, 10sec real time advances 1 minute in game time +#define GAME_MINUTE_IN_TICKS (GAME_MINUTE_IN_SECONDS*1000) ///< Number of ticks for each game minute, 10sec real time advances 1 minute in game time /** @name Minimum guild requirements */ Modified: trunk/src/npcclient/globals.h =================================================================== --- trunk/src/npcclient/globals.h 2018-04-30 11:45:31 UTC (rev 10001) +++ trunk/src/npcclient/globals.h 2018-07-01 13:27:25 UTC (rev 10002) @@ -18,7 +18,7 @@ */ /* This file holds definitions for ALL global variables in the planeshift - * server, normally you should move global variables into the psServer class + * npcclient, normally you should move global variables into the psServer class */ #ifndef __GLOBALS_H__ #define __GLOBALS_H__ Modified: trunk/src/npcclient/networkmgr.cpp =================================================================== --- trunk/src/npcclient/networkmgr.cpp 2018-04-30 11:45:31 UTC (rev 10001) +++ trunk/src/npcclient/networkmgr.cpp 2018-07-01 13:27:25 UTC (rev 10002) @@ -1114,7 +1114,7 @@ gemNPCObject* target = npcclient->FindEntityID(targetEID); if(!target) { - NPCDebug(npc, 5, "Got access perception from unknown target(%s)!\n", ShowID(targetEID)); + NPCDebug(npc, 5, "Got assess perception from unknown target(%s)!\n", ShowID(targetEID)); break; } Modified: trunk/src/npcclient/npcbehave.cpp =================================================================== --- trunk/src/npcclient/npcbehave.cpp 2018-04-30 11:45:31 UTC (rev 10001) +++ trunk/src/npcclient/npcbehave.cpp 2018-07-01 13:27:25 UTC (rev 10002) @@ -1031,7 +1031,7 @@ } // TODO: Remove this check when all servers has been updated. - // This field of the behavior is now depricated. + // This field of the behavior is now deprecated. csString tmp = node->GetAttributeValue("auto_memorize"); if(tmp.Length()) { Modified: trunk/src/npcclient/npcclient.cpp =================================================================== --- trunk/src/npcclient/npcclient.cpp 2018-04-30 11:45:31 UTC (rev 10001) +++ trunk/src/npcclient/npcclient.cpp 2018-07-01 13:27:25 UTC (rev 10002) @@ -309,6 +309,7 @@ // Starts the logon process network->Authenticate(host,port,user,pass); + // periodically writes a log file with online/offline status of NPCClient to be read by websites NPCStatus::Initialize(objreg); return true; @@ -638,6 +639,7 @@ void psNPCClient::Remove(gemNPCObject* object) { + // checks if it's a gemNPCActor NPC* npc = object->GetNPC(); if(npc) { @@ -658,6 +660,7 @@ all_gem_objects_by_pid.DeleteAll(object->GetPID()); } + // check if the entity is an Item gemNPCItem* item = dynamic_cast<gemNPCItem*>(object); if(item) { @@ -695,6 +698,7 @@ } + // check if the entity is a Character gemNPCActor* actor = dynamic_cast<gemNPCActor*>(object); if(actor) { @@ -1169,7 +1173,7 @@ { bool foundUser = false; - // Only trigger NPCs that have this percpetion type registered as a reaction. + // Only trigger NPCs that have this perception type registered as a reaction. csHash<NPC*,csString>::Iterator iter(allReactions.GetIterator(pcpt->GetName())); while(iter.HasNext()) { @@ -1436,7 +1440,7 @@ } else { - // Mach by pattern + // Match by pattern for(size_t i=0; i<npcs.GetSize(); i++) { Modified: trunk/src/npcclient/npcoperations.cpp =================================================================== --- trunk/src/npcclient/npcoperations.cpp 2018-04-30 11:45:31 UTC (rev 10001) +++ trunk/src/npcclient/npcoperations.cpp 2018-07-01 13:27:25 UTC (rev 10002) @@ -701,6 +701,7 @@ return OPERATION_FAILED; // This operation is complete } + // did we reach the final destination? float distance = npcclient->GetWorld()->Distance2(myPos, mySector, endPos, endSector); if(distance < 0.5) { Modified: trunk/src/npcclient/perceptions.h =================================================================== --- trunk/src/npcclient/perceptions.h 2018-04-30 11:45:31 UTC (rev 10001) +++ trunk/src/npcclient/perceptions.h 2018-07-01 13:27:25 UTC (rev 10002) @@ -17,9 +17,6 @@ * */ -/* This file holds definitions for ALL global variables in the planeshift -* server, normally you should move global variables into the psServer class -*/ #ifndef __PERCEPTIONS_H__ #define __PERCEPTIONS_H__ Modified: trunk/src/server/adminmanager.cpp =================================================================== --- trunk/src/server/adminmanager.cpp 2018-04-30 11:45:31 UTC (rev 10001) +++ trunk/src/server/adminmanager.cpp 2018-07-01 13:27:25 UTC (rev 10002) @@ -5165,7 +5165,8 @@ float loc_x = 0.0f, loc_y = 0.0f, loc_z = 0.0f, loc_yrot = 0.0f; int degrees = 0; - if(data->targetObject) //If the target is online or is an item or action location get some data about it like position and eid + //If the target is online or is an item or action location get some data about it like position and eid + if(data->targetObject) { entityId = data->targetObject->GetEID(); csVector3 pos; @@ -5184,7 +5185,8 @@ regionName = (sector) ? sector->QueryObject()->GetObjectParent()->GetName() : "(null)"; } - if(data->targetObject && data->targetObject->GetALPtr()) // Action location + // Action location + if(data->targetObject && data->targetObject->GetALPtr()) { gemActionLocation* item = dynamic_cast<gemActionLocation*>(data->targetObject); if(!item) @@ -5213,7 +5215,8 @@ return; } - if(data->targetObject && data->targetObject->GetItem() && data->targetObject->GetItem()->GetBaseStats()) // Item + // Item + if(data->targetObject && data->targetObject->GetItem() && data->targetObject->GetItem()->GetBaseStats()) { psItem* item = data->targetObject->GetItem(); Modified: trunk/src/server/bulkobjects/servervitals.cpp =================================================================== --- trunk/src/server/bulkobjects/servervitals.cpp 2018-04-30 11:45:31 UTC (rev 10001) +++ trunk/src/server/bulkobjects/servervitals.cpp 2018-07-01 13:27:25 UTC (rev 10002) @@ -123,6 +123,7 @@ else group->Broadcast(msg.msg); + // reset statsDirty flag to zero statsDirty = backup; return true; } Modified: trunk/src/server/gem.h =================================================================== --- trunk/src/server/gem.h 2018-04-30 11:45:31 UTC (rev 10001) +++ trunk/src/server/gem.h 2018-07-01 13:27:25 UTC (rev 10002) @@ -194,6 +194,10 @@ void RemovePlayerFromLootables(PID playerID); void UpdateAllDR(); + + /** + * Searches all actors in the game, and updates their vitals + */ void UpdateAllStats(); void GetAllEntityPos(csArray<psAllEntityPosMessage> &msgs); @@ -1556,7 +1560,10 @@ */ bool LogLine(const char* szLine); - + /** + * Checks the vitals (hp, mana, ...) for the specific gemActor + * If there are updates to publish, it then uses SendStatDRMessage to inform all actors client side + */ void UpdateStats(); void ProcessStamina(); void ProcessStamina(const csVector3 &velocity, bool force=false); @@ -1650,8 +1657,13 @@ virtual void GetLastSuperclientPos(csVector3 &pos, InstanceID &instance, csTicks &last) const; virtual void SetLastSuperclientPos(const csVector3 &pos, InstanceID instance, const csTicks &now); + // Sends statDR to all clients that have this client targeted virtual void BroadcastTargetStatDR(ClientConnectionSet* clients); + + // Sends this actor statDR to the client specified, who has this actor as a target virtual void SendTargetStatDR(Client* client); + + // Sends statDR to the client owning this actor, and to all clients that have this client targeted virtual void SendGroupStats(); void SetAction(const char* anim,csTicks &timeDelay); Modified: trunk/src/server/npcmanager.cpp =================================================================== --- trunk/src/server/npcmanager.cpp 2018-04-30 11:45:31 UTC (rev 10001) +++ trunk/src/server/npcmanager.cpp 2018-07-01 13:27:25 UTC (rev 10002) @@ -1062,6 +1062,7 @@ if(attacker && attacker->IsAlive()) { gemActor* target = dynamic_cast<gemActor*>(gemSupervisor->FindObject(target_id)); + // the target has been cleared, so stop the attack if(!target) { attacker->SetTarget(target); @@ -1201,7 +1202,7 @@ progScript = psserver->GetProgressionManager()->FindScript(scriptName.GetDataSafe()); if(!progScript) { - Error2("Faild to find script %s",scriptName.GetDataSafe()); + Error2("Failed to find script %s",scriptName.GetDataSafe()); break; } @@ -1845,7 +1846,7 @@ if(item.IsEmpty()) { - Debug1(LOG_SUPERCLIENT, entity_id.Unbox(), "Transfere with empty item not possible.\n"); + Debug1(LOG_SUPERCLIENT, entity_id.Unbox(), "Transfer with empty item not possible.\n"); break; } Modified: trunk/src/server/psserver.cpp =================================================================== --- trunk/src/server/psserver.cpp 2018-04-30 11:45:31 UTC (rev 10001) +++ trunk/src/server/psserver.cpp 2018-07-01 13:27:25 UTC (rev 10002) @@ -621,6 +621,7 @@ Debug1(LOG_STARTUP,0,"Server status reporter initialized."); } + // Loads the date and time from database and publishes to all clients weathermanager->StartGameTime(); return true; } Modified: trunk/src/server/weathermanager.cpp =================================================================== --- trunk/src/server/weathermanager.cpp 2018-04-30 11:45:31 UTC (rev 10001) +++ trunk/src/server/weathermanager.cpp 2018-07-01 13:27:25 UTC (rev 10002) @@ -603,6 +603,7 @@ } case psWeatherMessage::DAYNIGHT: { + // Schedules a new event which will make the in-game time progress of 1 minute QueueNextEvent(GAME_MINUTE_IN_TICKS, psWeatherMessage::DAYNIGHT, 0, Modified: trunk/src/server/workmanager.cpp =================================================================== --- trunk/src/server/workmanager.cpp 2018-04-30 11:45:31 UTC (rev 10001) +++ trunk/src/server/workmanager.cpp 2018-07-01 13:27:25 UTC (rev 10002) @@ -2531,6 +2531,7 @@ if(target) { + // check if the target is an ActionLocation gemActionLocation* gemAction = target->GetALPtr(); if(gemAction) target = gemAction->GetAction()->GetRealItem(); Modified: trunk/vfs.cfg =================================================================== --- trunk/vfs.cfg 2018-04-30 11:45:31 UTC (rev 10001) +++ trunk/vfs.cfg 2018-07-01 13:27:25 UTC (rev 10002) @@ -12,6 +12,8 @@ VFS.Mount.cdrom = $(CDROM)$/ VFS.Mount.tmp = $(TMP)$/ +VFS.Mount.bins = d:$/Luca$/PS_distro$/PlaneShift 0.6.0dev$/ + VFS.Unix.CS_LOCALAPPDATA = $(HOME)$/.PlaneShift VFS.Win32.CS_LOCALAPPDATA = $(LOCALAPPDATA)$/PlaneShift This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <lpa...@us...> - 2022-10-21 20:00:16
|
Revision: 10014 http://sourceforge.net/p/planeshift/code/10014 Author: lpancallo Date: 2022-10-21 20:00:14 +0000 (Fri, 21 Oct 2022) Log Message: ----------- Fixed edge switch when navigating path network and there is a teleport link next. Added some comments. Improve delete npc. Modified Paths: -------------- trunk/lang/english/stringtable.xml trunk/src/npcclient/npcoperations.cpp trunk/src/server/bulkobjects/pscharacterloader.cpp trunk/src/server/database/mysql/deletenpc.sql Modified: trunk/lang/english/stringtable.xml =================================================================== --- trunk/lang/english/stringtable.xml 2022-02-06 14:08:47 UTC (rev 10013) +++ trunk/lang/english/stringtable.xml 2022-10-21 20:00:14 UTC (rev 10014) @@ -2,6 +2,8 @@ <StringTable> <item orig=" Do you really wish to leave Yliakum?" trans="" /> + <item orig=" +Do you really wish to leave Yliakum?" trans="" /> <item orig=" " trans="" /> <item orig=" CP left." trans="" /> <item orig=" in front of you" trans="" /> @@ -59,6 +61,7 @@ <item orig="Add New" trans="" /> <item orig="Add a comment about this event if you wish" trans="" /> <item orig="Add/Edit Action" trans="" /> + <item orig="Adjective item modifier" trans="" /> <item orig="Admin" trans="" /> <item orig="Admin text color" trans="" /> <item orig="Administrative banking" trans="" /> @@ -91,6 +94,7 @@ <item orig="Assigned GM:" trans="" /> <item orig="Attack" trans="" /> <item orig="Attackable" trans="" /> + <item orig="Attacks" trans="" /> <item orig="Attributes" trans="" /> <item orig="Auction" trans="" /> <item orig="Auction Alignment" trans="" /> @@ -627,6 +631,7 @@ <item orig="Pop-ups" trans="" /> <item orig="Pos" trans="" /> <item orig="Position:" trans="" /> + <item orig="Prefix item modifier" trans="" /> <item orig="Prev" trans="" /> <item orig="Prev Page" trans="" /> <item orig="Previous Icon (PgUp)" trans="" /> @@ -758,6 +763,7 @@ <item orig="Study" trans="" /> <item orig="Study Item" trans="" /> <item orig="Study notes:" trans="" /> + <item orig="Suffix item modifier" trans="" /> <item orig="Suggest Name" trans="" /> <item orig="System" trans="" /> <item orig="System Base" trans="" /> @@ -886,6 +892,9 @@ <item orig="You are not in a guild. New guilds must have a minimum of 1 members, and the fee is 20000 trias. Beware that a guild will be automatically disbanded if it has less than 5 members for more than 5 minutes Do you wish to found a guild now?" trans="" /> + <item orig="You are not in a guild. +New guilds must have a minimum of 1 members, and the fee is 20000 trias. Beware that a guild will be automatically disbanded if it has less than 5 members for more than 5 minutes +Do you wish to found a guild now?" trans="" /> <item orig="You can not ignore yourself." trans="" /> <item orig="You cannot have a negative CP value." trans="" /> <item orig="You currently have no petitions." trans="" /> @@ -943,6 +952,7 @@ <item orig="npcinternal text colour" trans="" /> <item orig="o&clock" trans="" /> <item orig="o'clock" trans="" /> + <item orig="queue an attack" trans="" /> <item orig="says" trans="" /> <item orig="says:" trans="dice:" /> <item orig="server" trans="" /> Modified: trunk/src/npcclient/npcoperations.cpp =================================================================== --- trunk/src/npcclient/npcoperations.cpp 2022-02-06 14:08:47 UTC (rev 10013) +++ trunk/src/npcclient/npcoperations.cpp 2022-10-21 20:00:14 UTC (rev 10014) @@ -5636,7 +5636,14 @@ psPathPoint* WanderOperation::GetNextPathPoint(NPC* npc, bool &teleport) { - // We are at the end of the path, get next edge. + + // Check if we should teleport this edge + if(currentEdge->IsTeleport()) + { + teleport = true; + } + + // We are at the end of the path, get next edge. if(!currentPathPointIterator || !currentPathPointIterator->HasNext()) { NPCDebug(npc, 5, "No more path points, changing edge..."); @@ -5651,12 +5658,6 @@ } } - // Check if we should teleport this edge - if(currentEdge->IsTeleport()) - { - teleport = true; - } - if(currentPathPointIterator->HasNext()) { currentPathPoint = currentPathPointIterator->Next(); Modified: trunk/src/server/bulkobjects/pscharacterloader.cpp =================================================================== --- trunk/src/server/bulkobjects/pscharacterloader.cpp 2022-02-06 14:08:47 UTC (rev 10013) +++ trunk/src/server/bulkobjects/pscharacterloader.cpp 2022-10-21 20:00:14 UTC (rev 10014) @@ -598,6 +598,7 @@ Error2("Failed to remove %s from GM events database/cache", ShowID(pid)); } + /// remove the items spawned in the world and owned by this character csArray<gemObject*> list; psserver->entitymanager->GetGEM()->GetPlayerObjects(pid, list); for(size_t x = 0; x < list.GetSize(); x++) Modified: trunk/src/server/database/mysql/deletenpc.sql =================================================================== --- trunk/src/server/database/mysql/deletenpc.sql 2022-02-06 14:08:47 UTC (rev 10013) +++ trunk/src/server/database/mysql/deletenpc.sql 2022-10-21 20:00:14 UTC (rev 10014) @@ -5,30 +5,39 @@ # use this command to know which NPCs are currently loaded # select name from players where alive_ind='Y'; +SET collation_connection = 'latin1_swedish_ci'; + # set here the name of the NPC you want to delete -set @npc_name='Aleena Arlavin'; +set @npc_name='Naripel Denoole'; +SET @npc_firstname=substring_index(@npc_name, ' ', 1); # get ID of NPC -select @npc_id:=id from characters where name=@npc_name; +select @npc_id:=id from characters where name=@npc_firstname; -# get range of values of NPC (THIS ASSUME IT WAS LOADED SERIALIZED WITH OTHER NPCs) -select @min_resp:=min(response_id) from npc_triggers where area=@npc_name; -select @max_resp:=max(response_id) from npc_triggers where area=@npc_name; +# set @npc_id=9674167; # perform deletion delete from npc_bad_text where npc=@npc_name; delete from npc_knowledge_areas where player_id=@npc_id; -# replace min and max with values obtained above -delete from npc_responses where id>=@min_resp and id<=@max_resp; +# responses and triggers +delete from npc_responses where trigger_id IN (select id from npc_triggers where area=@npc_name); +delete from npc_triggers where area=@npc_name; -delete from npc_triggers where area=@npc_name; delete from item_instances where char_id_owner=@npc_id; delete from character_skills where character_id=@npc_id; delete from merchant_item_categories where player_id=@npc_id; delete from trainer_skills where player_id=@npc_id; +delete from character_factions where character_id=@npc_id; +delete from character_relationships where character_id=@npc_id; +delete from character_traits where character_id=@npc_id; +delete from character_variables where character_id=@npc_id; + +delete from characters where id=@player_id; + #delete npcclient entries delete from sc_npc_definitions WHERE char_id=@npc_id; +delete from sc_npctypes WHERE name=@npc_firstname; delete from characters where id=@npc_id; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |