PDA

Просмотр полной версии : [CMD] /inter (телепорт по локациям)



Danny_Marcelo
10.07.2016, 15:50
Всем привет дорогие пользователи Pro - Pawn. Сегодня я Вам выкладываю очень полезную команду для телепорта по локациям. Сделал 150 разных локаций. Итак приступим:

К переменным:


enum e_Teleport_Points {
Float:e_tpX,
Float:e_tpY,
Float:e_tpZ,
e_tpInterior,
}



static gTeleportPoints[][e_Teleport_Points] = {
{-25.884498, -185.868988, 1003.546875, 17},
{6.091179, -29.271898, 1003.549438, 10},
{-30.946699, -89.609596, 1003.546875, 18},
{-25.132598, -139.066986, 1003.546875, 16},
{-27.312299, -29.277599, 1003.557250, 4},
{-26.691598, -55.714897, 1003.546875, 6},
{-1827.147338,7.207417,1061.143554, 14},
{-1861.936889, 54.908092, 1061.143554, 14},
{1.808619, 32.384357, 1199.593750, 1},
{315.745086, 984.969299, 1958.919067, 9},
{286.148986, -40.644397, 1001.515625, 1},
{286.800994, -82.547599, 1001.515625, 4},
{296.919982, -108.071998, 1001.515625, 6},
{314.820983, -141.431991, 999.601562, 7},
{316.524993, -167.706985, 999.593750, 6},
{302.292877, -143.139099, 1004.062500, 7},
{298.507934, -141.647048, 1004.054748, 7},
{1038.531372, 0.111030, 1001.284484, 3},
{444.646911, 508.239044, 1001.419494, 12},
{2215.454833, -1147.475585, 1025.796875, 15},
{833.269775, 10.588416, 1004.179687, 3},
{-103.559165, -24.225606, 1000.718750, 3},
{963.418762, 2108.292480, 1011.030273, 1},
{-2240.468505, 137.060440, 1035.414062, 6},
{663.836242, -575.605407, 16.343263, 0},
{2169.461181, 1618.798339, 999.976562, 1},
{1889.953369, 1017.438293, 31.882812, 10},
{-2159.122802, 641.517517, 1052.381713, 1},
{207.737991, -109.019996, 1005.132812, 15},
{204.332992, -166.694992, 1000.523437, 14},
{207.054992, -138.804992, 1003.507812, 3},
{203.777999, -48.492397, 1001.804687, 1},
{226.293991, -7.431529, 1002.210937, 5},
{161.391006, -93.159156, 1001.804687, 18},
{493.390991, -22.722799, 1000.679687, 17},
{501.980987, -69.150199, 998.757812, 11},
{-227.027999, 1401.229980, 27.765625, 18},
{457.304748, -88.428497, 999.554687, 4},
{454.973937, -110.104995, 1000.077209, 5},
{435.271331, -80.958938, 999.554687, 6},
{452.489990, -18.179698, 1001.132812, 1},
{681.557861, -455.680053, -25.609874, 1},
{375.962463, -65.816848, 1001.507812, 10},
{369.579528, -4.487294, 1001.858886, 9},
{373.825653, -117.270904, 1001.499511, 5},
{381.169189, -188.803024, 1000.632812, 17},
{244.411987, 305.032989, 999.148437, 1},
{271.884979, 306.631988, 999.148437, 2},
{291.282989, 310.031982, 999.148437, 3},
{302.180999, 300.722991, 999.148437, 4},
{322.197998, 302.497985, 999.148437, 5},
{346.870025, 309.259033, 999.155700, 6},
{-959.564392, 1848.576782, 9.000000, 17},
{384.808624, 173.804992, 1008.382812, 3},
{223.431976, 1872.400268, 13.734375, 0},
{772.111999, -3.898649, 1000.728820, 5},
{774.213989, -48.924297, 1000.585937, 6},
{773.579956, -77.096694, 1000.655029, 7},
{1527.229980, -11.574499, 1002.097106, 3},
{1523.509887, -47.821197, 1002.130981, 2},
{2496.049804, -1695.238159, 1014.742187, 3},
{1267.663208, -781.323242, 1091.906250, 5},
{513.882507, -11.269994, 1001.565307, 3},
{2454.717041, -1700.871582, 1013.515197, 2},
{2527.654052, -1679.388305, 1015.498596, 1},
{2543.462646, -1308.379882, 1026.728393, 2},
{1212.019897, -28.663099, 1000.953125, 3},
{761.412963, 1440.191650, 1102.703125, 6},
{1204.809936, -11.586799, 1000.921875, 2},
{1204.809936, 13.897239, 1000.921875, 2},
{942.171997, -16.542755, 1000.929687, 3},
{964.106994, -53.205497, 1001.124572, 3},
{-2640.762939, 1406.682006, 906.460937, 3},
{-729.276000, 503.086944, 1371.971801, 1},
{-794.806396, 497.738037, 1376.195312, 1},
{2350.339843, -1181.649902, 1027.976562, 5},
{2807.619873, -1171.899902, 1025.570312, 8},
{318.564971, 1118.209960, 1083.882812, 5},
{1412.639892, -1.787510, 1000.924377, 1},
{1302.519897, -1.787510, 1001.028259, 18},
{2522.000000, -1673.383911, 14.866223, 0},
{-221.059051, 1408.984008, 27.773437, 18},
{2324.419921, -1145.568359, 1050.710083, 12},
{-975.975708, 1060.983032, 1345.671875, 10},
{411.625976, -21.433298, 1001.804687, 2},
{418.652984, -82.639793, 1001.804687, 3},
{412.021972, -52.649898, 1001.898437, 12},
{-204.439987, -26.453998, 1002.273437, 16},
{-204.439987, -8.469599, 1002.273437, 17},
{-204.439987, -43.652496, 1002.273437, 3},
{246.783996, 63.900199, 1003.640625, 6},
{246.375991, 109.245994, 1003.218750, 10},
{288.745971, 169.350997, 1007.171875, 3},
{-2029.798339, -106.675910, 1035.171875, 3},
{-1398.065307, -217.028900, 1051.115844, 7},
{-1398.103515, 937.631164, 1036.479125, 15},
{-1444.645507, -664.526000, 1053.572998, 4},
{-1465.268676, 1557.868286, 1052.531250, 14},
{-1401.829956, 107.051300, 1032.273437, 1},
{-1790.378295, 1436.949829, 7.187500, 0},
{1643.839843, -1514.819580, 13.566620, 0},
{-1685.636474, 1035.476196, 45.210937, 0},
{76.632553, -301.156829, 1.578125, 0},
{1059.895996, 2081.685791, 10.820312, 0},
{1059.180175, 2148.938720, 10.820312, 0},
{2131.507812, 1600.818481, 1008.359375, 1},
{2315.952880, -1.618174, 26.742187, 0},
{2319.714843, -14.838361, 26.749565, 0},
{1710.433715, -1669.379272, 20.225049, 18},
{1494.325195, 1304.942871, 1093.289062, 3},
{235.508994, 1189.169897, 1080.339966, 3},
{223.043991, 1289.259888, 1082.199951, 1},
{225.630997, 1022.479980, 1084.069946, 7},
{295.138977, 1474.469971, 1080.519897, 15},
{328.493988, 1480.589966, 1084.449951, 15},
{385.803986, 1471.769897, 1080.209961, 15},
{375.971985, 1417.269897, 1081.409912, 15},
{490.810974, 1401.489990, 1080.339966, 2},
{447.734985, 1400.439941, 1084.339966, 2},
{227.722992, 1114.389893, 1081.189941, 5},
{260.983978, 1286.549927, 1080.299927, 4},
{221.666992, 1143.389893, 1082.679932, 4},
{27.132700, 1341.149902, 1084.449951, 10},
{-262.601990, 1456.619995, 1084.449951, 4},
{22.778299, 1404.959961, 1084.449951, 5},
{140.278000, 1368.979980, 1083.969971, 5},
{234.045990, 1064.879883, 1084.309937, 6},
{-68.294098, 1353.469971, 1080.279907, 6},
{-285.548981, 1470.979980, 1084.449951, 15},
{-42.581997, 1408.109985, 1084.449951, 8},
{83.345093, 1324.439941, 1083.889893, 9},
{260.941986, 1238.509888, 1084.259888, 9},
{1133.069946, -9.573059, 1000.750000, 12},
{2464.109863, -1698.659912, 1013.509949, 2},
{416.8144, 2537.6863, 10.0000, 10},
{2283.0396, -1137.5461, 1050.8984, 11},
{2208.5957, -1074.3628, 1050.4844, 1},
{2237.7783, -1077.3889, 1049.0234, 2},
{2233.4780, -1110.7450, 1050.8828, 5},
{2346.7014, -1184.1390, 1027.9766, 5},
{2232.1101, -1117.1912, 1050.8828, 5},
{2192.6206, -1202.7321, 1049.0234, 6},
{2313.0601, -1209.7261, 1049.0234, 6},
{2319.4553, -1023.3117, 1050.2109, 9},
{2251.8733, -1138.8230, 1050.6328, 9},
{2262.3333, -1138.4283, 1050.6328, 10},
{-2044.7096, 178.5866, 28.8359, 1},
{607.5771, -10.9472, 1000.9153, 1},
{612.9734, -75.8104, 997.9922, 2},
{-1473.0231, 755.9099, 40.8029, 0}
};


Ну и к командам:


CMD:inter(playerid, params[])
{
if (player_info[playerid][pAdmin] < 4) {
return 1;
}

if (isnull(params)) {
SendClientMessage(playerid, 0xAFAFAFAA, "Используйте: /inter [id интерьера]");
return 1;
}

new interior_id = strval(params) - 1;

if (!(0 < interior_id <= sizeof(gTeleportPoints))) {
SendClientMessage(playerid, 0xAFAFAFAA, "Неверный id интерьера. (От 1 до 150)");
return 1;
}

SetPlayerPos(playerid, gTeleportPoints[interior_id][e_tpX],
gTeleportPoints[interior_id][e_tpY],
gTeleportPoints[interior_id][e_tpZ]);
SetPlayerInterior(playerid, gTeleportPoints[interior_id][e_tpInterior]);
return 1;
}

У кого будет ошибка:



error 017 undefined symbol isnull


Куда нибудь в начало мода добавляем:



#if !defined isnull
#define isnull(%1) \
((!(%1[0])) || (((%1[0]) == '\1') && (!(%1[1]))))
#endif



Ну вот и всё. Надеюсь моя команда поможет Вам во многом. Например в создании домов и прочего.
За оптимизацию кода огромное спасибо: Ziggi

DeimoS
10.07.2016, 16:20
Ничего не хочу сказать, но подобную команду я видел ещё года 2-3 назад в одном из паблик модов (то ли Awesome DM, то ли какой-то подобный шлак).

И да, хоть кто-нибудь мне уже ответит, для чего извлекать из массива, в котором хранятся параметры команды, ОДИН ЕДИНСТВЕННЫЙ параметр? Он там и так ОДИН. Вместо этого

if(sscanf(params,"d",params[0])) return SCM(playerid, COLOR_GREY, "Используйте: /inter [id интерьера]");
Логичнее использовать это

if(isnull(params)) return SCM(playerid, COLOR_GREY, "Используйте: /inter [id интерьера]");
new interior_id = strval(params);

Да и что за SCM?
И почему нельзя было просто COLOR_GREY заменить на 0xAFAFAFAA перед копированием кода сюда? Разве этот макрос очень важен? :no:

ziggi
10.07.2016, 16:48
enum e_Teleport_Points {
Float:e_tpX,
Float:e_tpY,
Float:e_tpZ,
e_tpInterior,
}

static gTeleportPoints[][e_Teleport_Points] = {
{-25.884498, -185.868988, 1003.546875, 17},
{6.091179, -29.271898, 1003.549438, 10},
{-30.946699, -89.609596, 1003.546875, 18},
{-25.132598, -139.066986, 1003.546875, 16},
{-27.312299, -29.277599, 1003.557250, 4},
{-26.691598, -55.714897, 1003.546875, 6},
{-1827.147338, 7.207417,1061. 143554), 4},
{-1861.936889, 54.908092, 1061.143554, 14},
{1.808619, 32.384357, 1199.593750, 1},
{315.745086, 984.969299, 1958.919067, 9},
{286.148986, -40.644397, 1001.515625, 1},
{286.800994, -82.547599, 1001.515625, 4},
{296.919982, -108.071998, 1001.515625, 6},
{314.820983, -141.431991, 999.601562, 7},
{316.524993, -167.706985, 999.593750, 6},
{302.292877, -143.139099, 1004.062500, 7},
{298.507934, -141.647048, 1004.054748, 7},
{1038.531372, 0.111030, 1001.284484, 3},
{444.646911, 508.239044, 1001.419494, 12},
{2215.454833, -1147.475585, 1025.796875, 15},
{833.269775, 10.588416, 1004.179687, 3},
{-103.559165, -24.225606, 1000.718750, 3},
{963.418762, 2108.292480, 1011.030273, 1},
{-2240.468505, 137.060440, 1035.414062, 6},
{663.836242, -575.605407, 16.343263, 0},
{2169.461181, 1618.798339, 999.976562, 1},
{1889.953369, 1017.438293, 31.882812, 10},
{-2159.122802, 641.517517, 1052.381713, 1},
{207.737991, -109.019996, 1005.132812, 15},
{204.332992, -166.694992, 1000.523437, 14},
{207.054992, -138.804992, 1003.507812, 3},
{203.777999, -48.492397, 1001.804687, 1},
{226.293991, -7.431529, 1002.210937, 5},
{161.391006, -93.159156, 1001.804687, 18},
{493.390991, -22.722799, 1000.679687, 17},
{501.980987, -69.150199, 998.757812, 11},
{-227.027999, 1401.229980, 27.765625, 18},
{457.304748, -88.428497, 999.554687, 4},
{454.973937, -110.104995, 1000.077209, 5},
{435.271331, -80.958938, 999.554687, 6},
{452.489990, -18.179698, 1001.132812, 1},
{681.557861, -455.680053, -25.609874, 1},
{375.962463, -65.816848, 1001.507812, 10},
{369.579528, -4.487294, 1001.858886, 9},
{373.825653, -117.270904, 1001.499511, 5},
{381.169189, -188.803024, 1000.632812, 17},
{244.411987, 305.032989, 999.148437, 1},
{271.884979, 306.631988, 999.148437, 2},
{291.282989, 310.031982, 999.148437, 3},
{302.180999, 300.722991, 999.148437, 4},
{322.197998, 302.497985, 999.148437, 5},
{346.870025, 309.259033, 999.155700, 6},
{-959.564392, 1848.576782, 9.000000, 17},
{384.808624, 173.804992, 1008.382812, 3},
{223.431976, 1872.400268, 13.734375, 0},
{772.111999, -3.898649, 1000.728820, 5},
{774.213989, -48.924297, 1000.585937, 6},
{773.579956, -77.096694, 1000.655029, 7},
{1527.229980, -11.574499, 1002.097106, 3},
{1523.509887, -47.821197, 1002.130981, 2},
{2496.049804, -1695.238159, 1014.742187, 3},
{1267.663208, -781.323242, 1091.906250, 5},
{513.882507, -11.269994, 1001.565307, 3},
{2454.717041, -1700.871582, 1013.515197, 2},
{2527.654052, -1679.388305, 1015.498596, 1},
{2543.462646, -1308.379882, 1026.728393, 2},
{1212.019897, -28.663099, 1000.953125, 3},
{761.412963, 1440.191650, 1102.703125, 6},
{1204.809936, -11.586799, 1000.921875, 2},
{1204.809936, 13.897239, 1000.921875, 2},
{942.171997, -16.542755, 1000.929687, 3},
{964.106994, -53.205497, 1001.124572, 3},
{-2640.762939, 1406.682006, 906.460937, 3},
{-729.276000, 503.086944, 1371.971801, 1},
{-794.806396, 497.738037, 1376.195312, 1},
{2350.339843, -1181.649902, 1027.976562, 5},
{2807.619873, -1171.899902, 1025.570312, 8},
{318.564971, 1118.209960, 1083.882812, 5},
{1412.639892, -1.787510, 1000.924377, 1},
{1302.519897, -1.787510, 1001.028259, 18},
{2522.000000, -1673.383911, 14.866223, 0},
{-221.059051, 1408.984008, 27.773437, 18},
{2324.419921, -1145.568359, 1050.710083, 12},
{-975.975708, 1060.983032, 1345.671875, 10},
{411.625976, -21.433298, 1001.804687, 2},
{418.652984, -82.639793, 1001.804687, 3},
{412.021972, -52.649898, 1001.898437, 12},
{-204.439987, -26.453998, 1002.273437, 16},
{-204.439987, -8.469599, 1002.273437, 17},
{-204.439987, -43.652496, 1002.273437, 3},
{246.783996, 63.900199, 1003.640625, 6},
{246.375991, 109.245994, 1003.218750, 10},
{288.745971, 169.350997, 1007.171875, 3},
{-2029.798339, -106.675910, 1035.171875, 3},
{-1398.065307, -217.028900, 1051.115844, 7},
{-1398.103515, 937.631164, 1036.479125, 15},
{-1444.645507, -664.526000, 1053.572998, 4},
{-1465.268676, 1557.868286, 1052.531250, 14},
{-1401.829956, 107.051300, 1032.273437, 1},
{-1790.378295, 1436.949829, 7.187500, 0},
{1643.839843, -1514.819580, 13.566620, 0},
{-1685.636474, 1035.476196, 45.210937, 0},
{76.632553, -301.156829, 1.578125, 0},
{1059.895996, 2081.685791, 10.820312, 0},
{1059.180175, 2148.938720, 10.820312, 0},
{2131.507812, 1600.818481, 1008.359375, 1},
{2315.952880, -1.618174, 26.742187, 0},
{2319.714843, -14.838361, 26.749565, 0},
{1710.433715, -1669.379272, 20.225049, 18},
{1494.325195, 1304.942871, 1093.289062, 3},
{235.508994, 1189.169897, 1080.339966, 3},
{223.043991, 1289.259888, 1082.199951, 1},
{225.630997, 1022.479980, 1084.069946, 7},
{295.138977, 1474.469971, 1080.519897, 15},
{328.493988, 1480.589966, 1084.449951, 15},
{385.803986, 1471.769897, 1080.209961, 15},
{375.971985, 1417.269897, 1081.409912, 15},
{490.810974, 1401.489990, 1080.339966, 2},
{447.734985, 1400.439941, 1084.339966, 2},
{227.722992, 1114.389893, 1081.189941, 5},
{260.983978, 1286.549927, 1080.299927, 4},
{221.666992, 1143.389893, 1082.679932, 4},
{27.132700, 1341.149902, 1084.449951, 10},
{-262.601990, 1456.619995, 1084.449951, 4},
{22.778299, 1404.959961, 1084.449951, 5},
{140.278000, 1368.979980, 1083.969971, 5},
{234.045990, 1064.879883, 1084.309937, 6},
{-68.294098, 1353.469971, 1080.279907, 6},
{-285.548981, 1470.979980, 1084.449951, 15},
{-42.581997, 1408.109985, 1084.449951, 8},
{83.345093, 1324.439941, 1083.889893, 9},
{260.941986, 1238.509888, 1084.259888, 9},
{1133.069946, -9.573059, 1000.750000, 12},
{2464.109863, -1698.659912, 1013.509949, 2},
{416.8144, 2537.6863, 10.0000, 10},
{2283.0396, -1137.5461, 1050.8984, 11},
{2208.5957, -1074.3628, 1050.4844, 1},
{2237.7783, -1077.3889, 1049.0234, 2},
{2233.4780, -1110.7450, 1050.8828, 5},
{2346.7014, -1184.1390, 1027.9766, 5},
{2232.1101, -1117.1912, 1050.8828, 5},
{2192.6206, -1202.7321, 1049.0234, 6},
{2313.0601, -1209.7261, 1049.0234, 6},
{2319.4553, -1023.3117, 1050.2109, 9},
{2251.8733, -1138.8230, 1050.6328, 9},
{2262.3333, -1138.4283, 1050.6328, 10},
{-2044.7096, 178.5866, 28.8359, 1},
{607.5771, -10.9472, 1000.9153, 1},
{612.9734, -75.8104, 997.9922, 2},
{-1473.0231, 755.9099, 40.8029, 0}
};

CMD:inter(playerid, params[])
{
if (player_info[playerid][pAdmin] < 4) {
return 1;
}

if (isnull(params)) {
SendClientMessage(playerid, 0xAFAFAFAA, "Используйте: /inter [id интерьера]");
return 1;
}

new interior_id = strval(params) - 1;

if (sizeof(gTeleportPoints) <= interior_id < 0) {
SendClientMessage(playerid, 0xAFAFAFAA, "Неверный id интерьера. (От 1 до 150)");
return 1;
}

SetPlayerPos(playerid, gTeleportPoints[interior_id][e_tpX],
gTeleportPoints[interior_id][e_tpY],
gTeleportPoints[interior_id][e_tpZ]);
SetPlayerInterior(playerid, gTeleportPoints[interior_id][e_tpInterior]);
return 1;
}

Можно ещё добавить автоматический подсчёт разрешённых границ в сообщении об ошибке.


Да и что за SCM?

Такая вот, нынче модная "оптимизация".

Daniel_Cortez
10.07.2016, 16:54
Вместо этого

if(sscanf(params,"d",params[0])) return SCM(playerid, COLOR_GREY, "Используйте: /inter [id интерьера]");
Логичнее использовать это

if(isnull(params)) return SCM(playerid, COLOR_GREY, "Используйте: /inter [id интерьера]");
new interior_id = strval(params);

Не совсем корректно. Если вместо числа ввести строку (например, "abc"), strval просто вернёт 0, как будто введено правильное число.



Надеюсь моя команда поможет Вам во многом.
А что такого уникального в вашей команде, что она должна кому-то помочь? Что отличает её от аналогичных вариантов из сотен других RLS модов с кодом схожего "качества"?

Danny_Marcelo
10.07.2016, 17:00
Ничего не хочу сказать, но подобную команду я видел ещё года 2-3 назад в одном из паблик модов (то ли Awesome DM, то ли какой-то подобный шлак).

И да, хоть кто-нибудь мне уже ответит, для чего извлекать из массива, в котором хранятся параметры команды, ОДИН ЕДИНСТВЕННЫЙ параметр? Он там и так ОДИН. Вместо этого

if(sscanf(params,"d",params[0])) return SCM(playerid, COLOR_GREY, "Используйте: /inter [id интерьера]");
Логичнее использовать это

if(isnull(params)) return SCM(playerid, COLOR_GREY, "Используйте: /inter [id интерьера]");
new interior_id = strval(params);

Да и что за SCM?
И почему нельзя было просто COLOR_GREY заменить на 0xAFAFAFAA перед копированием кода сюда? Разве этот макрос очень важен? :no:

Ну вот так вот учат на pawn форумах) Спасибо за замечание.

- - - Добавлено - - -


Не совсем корректно. Если вместо числа ввести строку (например, "abc"), strval просто вернёт 0, как будто введено правильное число.



А что такого уникального в вашей команде, что она должна кому-то помочь? Что отличает её от аналогичных вариантов из сотен других RLS модов с кодом схожего "качества"?

Ну я уникально в ней только то, что тут есть большинство интерьеров, которых нет в других RLSовских командах. В интернете специально искал, нет многих стандартных интерьеров. Следственно координаты всем нужно брать самим. Зачем лезть в интернет? Юзать собейт, когда пишешь мод с 0 особенно, если можно сразу телепортироваться в определенный интерьер с помощью данной команды и уже взять координаты пикапов и телепортов. Времени меньше убьёшь просто.

DeimoS
10.07.2016, 17:21
Не совсем корректно. Если вместо числа ввести строку (например, "abc"), strval просто вернёт 0, как будто введено правильное число.

Я об этом не упомянул лишь потому, что команда нацелена больше именно на разработчиков и админов, чем на обычных игроков. А те сами должны понимать, что в команду передаются именно числа, поэтому делать такую проверку довольно бессмысленно.
Ну а если очень нужно, то можно обойтись обычным сдвигом всех ID на 1 вверх, тем самым освободив ID 0 и избавится от нужды проверять, ввёл ли игрок именно число или нет. Это одна из реализаций, о которой уже должен думать автор. Я лишь указал на распространённую ошибку, которая касается sscanf.

И да, sscanf тоже вернёт 0, если в параметрах передать строку.

- - - Добавлено - - -



Ну я уникально в ней только то, что тут есть большинство интерьеров, которых нет в других RLSовских командах. В интернете специально искал, нет многих стандартных интерьеров. Следственно координаты всем нужно брать самим. Зачем лезть в интернет? Юзать собейт, когда пишешь мод с 0 особенно, если можно сразу телепортироваться в определенный интерьер с помощью данной команды и уже взять координаты пикапов и телепортов. Времени меньше убьёшь просто.

В идеале это всё лучше реализовать в виде кликабельных текстдравов. Как, например, есть скрипт со списком всех анимаций, растасованных по своим библиотекам, на текстдравах, опубликованный на официальном форуме (ссылко (http://forum.sa-mp.com/showthread.php?t=587916)). Будет гораздо удобнее искать нужный интерьер (особенно если каждый назовёшь подобающи и будешь выводить о каждом инфу в чат (ID интерьера и т.п.)). Тогда она будет действительно уникальна и полезна. А пока - так себе

Daniel_Cortez
10.07.2016, 21:25
Я об этом не упомянул лишь потому, что команда нацелена больше именно на разработчиков и админов, чем на обычных игроков. А те сами должны понимать, что в команду передаются именно числа, поэтому делать такую проверку довольно бессмысленно.
Ну а если очень нужно, то можно обойтись обычным сдвигом всех ID на 1 вверх, тем самым освободив ID 0 и избавится от нужды проверять, ввёл ли игрок именно число или нет. Это одна из реализаций, о которой уже должен думать автор. Я лишь указал на распространённую ошибку, которая касается sscanf.
Для чего все эти "админ же знает, что нужно вводить только числа" и "начинать с ID 1 вместо 0"? К чему все эти условности, когда можно просто сделать всё так, как делаешь обычно, с помощью sscanf2?
Я говорил это раньше, скажу и сейчас: если пытаться держать в голове излишние тонкости реализации, то потом неизбежно что-то забудешь и ничего хорошего из этого не выйдет.



И да, sscanf тоже вернёт 0, если в параметрах передать строку.
http://ihost.pro-pawn.ru/image.php?di=KN33

Desulaid
10.07.2016, 21:54
> 2k16
> strcmp

Danny_Marcelo, извините, но почему нельзя написать команду без особых привязок к реализациям других модов? Может, я только мод пишу, а тут некий массив params :to_take_umbrage:. Да и в строку писать - не модно. :cry:


Switch() против обращения к ячейке массива :to_take_umbrage:. Не уверен в таком уж приросте к скорости. У меня выше 20 ячеек в массиве при обращении скорость на наносекунды различается. Это к реализации ziggi. Глобальный массив, используемый в одном моменте? Окстись.

Вариант на диалоге был бы более интересный. Сгруппируй интерьеры. Можно вариант по нескольким критериям сортировки для большего удобства во время поиска сделать. 1:0 в пользу s0beit :i-m_so_happy:.

ziggi
10.07.2016, 22:52
Switch() против обращения к ячейке массива :to_take_umbrage:. Не уверен в таком уж приросте к скорости. У меня выше 20 ячеек в массиве при обращении скорость на наносекунды различается. Это к реализации ziggi. Глобальный массив, используемый в одном моменте? Окстись.

Последнее о чём я думаю - это о скорости работы. Для меня на первом месте стоит читабельность и повторное использование кода. Но тут, в добавок к читабельности, идёт прирост скорости, что, конечно, не может не радовать. И я не вижу причины не использовать массив, даже если он понадобится лишь в одной функции (памяти жалко, или что?).

Desulaid
10.07.2016, 23:03
Последнее о чём я думаю - это о скорости работы. Для меня на первом месте стоит читабельность и повторное использование кода. Но тут, в добавок к читабельности, идёт прирост скорости, что, конечно, не может не радовать. И я не вижу причины не использовать массив, даже если он понадобится лишь в одной функции (памяти жалко, или что?).

Нет. Память никак не жалко. Просто не вижу смысла в объявлении глобального массива (почему не const? данные попртят), если обращается к нему только одна команда. Лучше бы локально объявил. Разницы будет не так много.

DeimoS
10.07.2016, 23:08
сделать всё так, как делаешь обычно, с помощью sscanf2?



new x = cellmin;

Часто ли ты видел, что в модах используется cellmin? А уж тем более при использовании params или инициализации переменной?

Вот так делается "как обычно"
http://i.imgur.com/j61a1Dd.png
То бишь, переменной вообще не присваивается значение (тут я указал 0 для наглядности).





Я говорил это раньше, скажу и сейчас: если пытаться держать в голове излишние тонкости реализации, то потом неизбежно что-то забудешь и ничего хорошего из этого не выйдет.

Этот не тот случай, где если ты что-то забудешь, из этого выйдет что-то плохое. Да и я тоже уже говорил, что человек - не машина, которую как запрограммировали, так она и работает. И тот свод правил, что уже когда-то был придуман людьми, не является единственным возможным. И лично у меня не было фатальных ситуаций, когда я что-либо вдруг забывал и это всё безвозвратно рушило. Мозг - система гибкая.

И да, я понимаю, когда подобные (не те, что я предлагал, а о которых мы до этого говорили. Тончайшие тонкости :D) "тонкости" выносятся на публику - это, несомненно, плохо. Но если ты код, который не предназначенный для общественности, пишешь сугубо "толсто" - хмм... Часто такие "тонкости" как упрощают написание/читаемость кода, так и оптимизируют этот самый код. В общем, всё зависит конкретно от ситуации. И данная ситуация, имхо, не является слишком "тонкой"

- - - Добавлено - - -


Нет. Память никак не жалко. Просто не вижу смысла в объявлении глобального массива (почему не const? данные попртят), если обращается к нему только одна команда. Лучше бы локально объявил. Разницы будет не так много.

И всеобщий фетишь на "const" тоже понять не могу :с Насколько надо быть упоротым, чтоб работать с массивом, предназначение которого ты забыл? А если не забыл, то как можно попортить данные в нём?

Danny_Marcelo
10.07.2016, 23:49
> 2k16
> strcmp

Danny_Marcelo, извините, но почему нельзя написать команду без особых привязок к реализациям других модов? Может, я только мод пишу, а тут некий массив params :to_take_umbrage:. Да и в строку писать - не модно. :cry:


Switch() против обращения к ячейке массива :to_take_umbrage:. Не уверен в таком уж приросте к скорости. У меня выше 20 ячеек в массиве при обращении скорость на наносекунды различается. Это к реализации ziggi. Глобальный массив, используемый в одном моменте? Окстись.

Вариант на диалоге был бы более интересный. Сгруппируй интерьеры. Можно вариант по нескольким критериям сортировки для большего удобства во время поиска сделать. 1:0 в пользу s0beit :i-m_so_happy:.

Я наверное Вас немного не допонял.
а тут некий массив params params - это параметр используемый плагином sscanf2 для разделения команды и её параметров.(Если я правильно это назвал).
Да и в строку писать - не модно. Если вы говорите о моде, то все современные скриптеры используют плагин sscanf, будь то стандартный командный процессор или же любой другой.


Сгруппируй интерьеры. Можно вариант по нескольким критериям сортировки для большего удобства во время поиска сделать На счет диалогов, подумаю, стоит ли.
1:0 в пользу s0beit :i-m_so_happy:. Вы глубоко ошибаетесь. Что бы найти многие интерьеры тут, я не ограничивался одним собейтом. Ещё команда /setint (которая меняет id интерьера), т.к. стандартные интерьеры находятся под своим id. Так что благодаря собейту, не все интерьеры вы найдёте, да и летать на много дольше в поисках нужного, чем чекнуть 150 локаций за 1,5 минуты)

Desulaid
11.07.2016, 00:11
params - это параметр используемый плагином sscanf2 для разделения команды и её параметров.(Если я правильно это назвал).

В zcmd, dc_cmd и т.д. этот массив - атрибут, так сказать, команды. В твоей команде есть где-то объявление этого массива?



Если вы говорите о моде, то все современные скриптеры используют плагин sscanf, будь то стандартный командный процессор или же любой другой.

Речь шла про использование case в switch().



На счет диалогов, подумаю, стоит ли.

Лучше ведь тыкать наугад. Нуок.



Вы глубоко ошибаетесь. Что бы найти многие интерьеры тут, я не ограничивался одним собейтом. Ещё команда /setint (которая меняет id интерьера), т.к. стандартные интерьеры находятся под своим id. Так что благодаря собейту, не все интерьеры вы найдёте, да и летать на много дольше в поисках нужного, чем чекнуть 150 локаций за 1,5 минуты)
Ну тогда вопрос в другом, а нужна ли эта команда, если можно поискать нужный интерьер в интернете, для теста поставить игрока в этот интерьер и взять нужную позицию.



И всеобщий фетишь на "const" тоже понять не могу :с Насколько надо быть упоротым, чтоб работать с массивом, предназначение которого ты забыл? А если не забыл, то как можно попортить данные в нём?

А как некоторые люди забывают ставить ";" в конце строки? А как умудряются достать внутренности из инклуда и вписать их? А как умудряются писать код вне паблика?

Например.

new deimos[2][3] =
{
{0, 1, 2},
{3, 4, 6}
};

main()
{
deimos[0][0] = (deimos[0][0] == 0);
printf("%d", deimos[0][0]);
}

ziggi
11.07.2016, 00:27
А как некоторые люди забывают ставить ";" в конце строки? А как умудряются достать внутренности из инклуда и вписать их? А как умудряются писать код вне паблика?

Например.

new deimos[2][3] =
{
{0, 1, 2},
{3, 4, 6}
};

main()
{
deimos[0][0] = (deimos[0][0] == 0);
printf("%d", deimos[0][0]);
}

Да, те переменные, которые не должны меняться лучше объявлять как const. Но массив всё же лучше объявить в глобальной области видимости, ибо смешивание данных и логики - это дурной тон.

DeimoS
11.07.2016, 00:42
А как некоторые люди забывают ставить ";" в конце строки?

Ты сейчас сравниваешь немного не то. Люди забывают ставить точку с запятой когда сами пишут код. И компилятор им об этом напоминает. Точка с запятой ставится практически везде. А массив, который ты определил где-то там, используется, дай бог, 5 раз во всём моде. И никто через 2 года не станет куда-то его прописывать, не посмотрев его предназначения (а если станет, то такой человек вообще любую чушь может натворить и его к программированию допускать не стоит).


А как умудряются достать внутренности из инклуда и вписать их? А как умудряются писать код вне паблика?

А это уже больше к нубам, которые делают это по незнанию, нежели к человеку, который просто пишет код. Опять же, додумается использовать массив с какими-то статичными данными в местах, где значение этих данных как-то изменяется, только полный кретин. И если не в твоём коде с const он это сделает, так где-либо ещё. Вечно ты за ним со своим const бегать не сможешь, поэтому бессмысленно её пихать везде, где только можно. Я полностью солидарен с Ziggi в этом вопросе. Нужно быть более гибким и подстраиваться под ситуацию, а не вбить себе в голову одну инструкцию и следовать ей.


Попытка подсунуть const везде, где ни попадя - это как попытка запретить пистолеты лишь потому, что один из них может попасть к обезьяне в лапы. Нужно не пистолеты запрещать, а обезьянам не давать брать в руки пистолет

Desulaid
11.07.2016, 00:53
DeimoS, ок. Будем писать везде массивы для обращения к ним один раз в самом верху мода. На логику ведь это так повлияет (нет).
Я не так близок к программированию, как вы, может и трактую не ту позицию, но разве за логику кода не отвечает название переменных, функций и т.д.? И если имя переменной совпало с другой переменной, то стоит цель существования этой переменной обозначить более конкретнее? Объявление переменной внешне от функции ну никак я не могу сопоставить с логикой :sad:.



Попытка подсунуть const везде, где ни попадя - это как попытка запретить пистолеты лишь потому, что один из них может попасть к обезьяне в лапы. Нужно не пистолеты запрещать, а обезьянам не давать брать в руки пистолет


Где не попадя? То есть неизменные данные, которые не должны быть изменены, ты будешь делать изменяемыми? Как такое можно вообще сравнить с пистолетом? Скорее, это незакрытая дверь. Да, она может быть закрыта, но ты ее не закрываешь и надеешься на состоятельность других, чтобы не открывали ее, ведь за дверью твоя квартира...

Daniel_Cortez
11.07.2016, 00:54
И я не вижу причины не использовать массив, даже если он понадобится лишь в одной функции (памяти жалко, или что?).
Не знаю, сарказм это был или нет, но всё же попробую разъяснить для тех, кто не в курсе: жалеть здесь нечего, поскольку будет только экономия памяти. В варианте со switch память будут занимать не только координаты, но и дублирующийся код вызовов SetPlayerPos и SetPlayerInterior. Если же взять вариант с массивом, до место в память будут занимать только координаты, пара вызовов SetPlayerPos/SetPlayerInterior и сравнительно компактный код обращения к массиву. Так что это даже не двойная (читаемость + скорость), а тройная выгода.



Часто ли ты видел, что в модах используется cellmin? А уж тем более при использовании params или инициализации переменной?
Это был всего лишь пример, чтобы показать, что sscanf2 ничего не записал в переменную X при ошибке считывания. Именно поэтому вместо "-2147483648" было выведено "--", это известный баг format и printf.




Вот так делается "как обычно"
http://i.imgur.com/j61a1Dd.png

В таком случае, ты не совсем правильно выразился в предыдущем посте.

И да, sscanf тоже вернёт 0, если в параметрах передать строку.
Под "возвращаемым значением" обычно имеют в виду именно то значение, которое функция возвращает сама (логично же), а не то, которое она записывает в аргументы, передаваемые по ссылке.



То бишь, переменной вообще не присваивается значение (тут я указал 0 для наглядности).
Именно это я и хотел показать, присвоив переменной cellmin. Никогда бы не подумал, что тот баг в printf окажется таким незаметным.



Этот не тот случай, где если ты что-то забудешь, из этого выйдет что-то плохое.
Но и обыденность из этого тоже делать нельзя. Это считалось, считается и будет считаться плохой практикой, поскольку такой подход рано или поздно неизбежно ведёт к ошибкам. Обычно он оправдывается только в самых крайних ситуациях - в OnPlayerUpdate, например, когда от оптимальности кода всего лишь в одной функции зависит то, сколько игроков сможет выдержать сервер. И то при использовании нестандартных решений, скорее всего, придётся оставить кучу комментариев посреди кода, чтобы не запутаться во время следующего "визита".



И да, я понимаю, когда подобные (не те, что я предлагал, а о которых мы до этого говорили. Тончайшие тонкости :D) "тонкости" выносятся на публику - это, несомненно, плохо. Но если ты код, который не предназначенный для общественности, пишешь сугубо "толсто" - хмм... Часто такие "тонкости" как упрощают написание/читаемость кода, так и оптимизируют этот самый код.
Если делить своё творчество на то, что "для паблика", и то, что "для себя", то вряд ли научишься хорошо писать код. Вернее, научиться можно, но с пропогандируемым тобой подходом это будет куда сложнее. Суть в том, что чем больше заботишься об элегантности и простоте восприятия своего кода, уделяешь время повторному инспектированию, тем чаще попутно обнаруживаешь и исправляешь ошибки, учась чему-то новому.

DeimoS
11.07.2016, 01:27
В таком случае, ты не совсем правильно выразился в предыдущем посте.

Под "возвращаемым значением" обычно имеют в виду именно то значение, которое функция возвращает сама (логично же), а не то, которое она записывает в аргументы, передаваемые по ссылке.
Прошу прощения. Это SA-MP головного мозга. Я выразился именно так ли потому, что привык, что в Pawn переменная дефолтно заполняется нулём, а в командах обычно, при объявлении, переменным не присваивают какого-либо значения, отличного от нуля, поэтому и не стал заострять внимание на истинной работе функции, а лишь пытался передать общий смысл.




Но и обыденность из этого тоже делать нельзя. Это считалось, считается и будет считаться быдлокодерством, поскольку такой подход рано или поздно неизбежно ведёт к ошибкам.

Я понимаю о чём ты говоришь в целом, но как твои слова относятся конкретно к этому случаю? Когда все "минусы" распространяются лишь на администрацию, которая этой командой вдруг начнёт пользоваться, решит написать буквы вместо числа и её телепортирует по координатам, которые закреплены за нулевым ID. По-моему, ты слишком преувеличиваешь сейчас...



Если делить своё творчество на то, что "для паблика", и то, что "для себя", то вряд ли научишься хорошо писать код. Вернее, научиться можно, но с пропогандируемым тобой подходом это будет куда сложнее.

Вариант "для паблика" и вариант "для себя" мало чем отличается. Это не как, например, написать программу с закрытым исходным кодом, но такими изощрёнными методами (дающими больший прирост к скорости), которые и поддерживать, и показывать кому-то страшно.
Нет. Просто когда я пишу "для себя", я использую "изощренные методы", которые хорошо известны мне и предназначение которых я прекрасно понимаю, которые я часто использую, и альтернативные ("правильные") варианты написания которых я так же прекрасно знаю. И мне не составит труда сделать то же самое, но "правильно", если это потребуется ситуацией.
Как по мне, именно такого, более гибкого, подхода должен придерживаться каждый. Именно тогда это можно назвать творчеством и именно тогда это можно назвать более профессиональным подходом (знание всех аспектов написания определённой системы).

А быть либо полным говнокодером, либо полным профи - как-то скучно. Не знаю, может именно это меня и подведёт, не дав мне развиться как программисту. Но мне так больше нравится работать, чем зазубривать "правильные" подходы, придуманные какими-то дядьками, которые уже успели чего-то добиться (потому они, как по мне, и добились, что думали неординарно и создали то, до чего другие бы не додумались). В общем, это отдельная тема и о ней мы можем отдельно поговорить, если есть желание.




Суть в том, что чем больше заботишься об элегантности и простоте восприятия своего кода, уделяешь время повторному инспектированию, тем чаще попутно обнаруживаешь и исправляешь ошибки, учась чему-то новому.

И тем меньше шансов придумать что-то поистине новое. Твой подход, как по мне, правилен для работы (для "серьёзного" программирования). Когда ты пишешь код для себя, что тебе мешает экспериментировать? Хуже, чем уже придумали, ты вряд ли сделаешь, если ты знаком с тем, что уже придумали и как к этому дошли. При этом, ты лучше поймёшь то, как до придуманного дошли и какие ещё есть варианты реализации того, над чем ты работаешь. В общем, по-моему, это и есть то самое творчество, о котором ты говоришь.





DeimoS, ок. Будем писать везде массивы для обращения к ним один раз в самом верху мода. На логику ведь это так повлияет (нет).

Я говорил про то, что нужно все массивы объявлять глобально? Я говорил лишь о неразумном приписывании "const" везде, где только компилятор не выдаст ошибку. И в случае с кодом Ziggi константа совсем не обязательна, если ты, конечно, не обезьяна, которая беспорядочно нажимает на клавиши и ей пока везло, что получался какой-то рабочий код.


Я не так близок к программированию, как вы

Я тоже к программированию не близок





Где не попадя? То есть неизменные данные, которые не должны быть изменены, ты будешь делать изменяемыми?

Данные, которые не должны меняться, я просто не буду пытаться менять. У меня ещё ни разу не было ситуации, когда я вдруг решил массив, который объявлен как константа, взять и изменить (точнее, изменить значение в нём). Как вообще ты представляешь себе такую ситуацию, даже если представить, что код попался в руки нубу? Для чего ему править твой код и дописывать функцию, которая будет изменять значение твоего массива?

Desulaid
11.07.2016, 02:37
DeimoS,


Да, те переменные, которые не должны меняться лучше объявлять как const.


Вечно ты за ним со своим const бегать не сможешь, поэтому бессмысленно её пихать везде, где только можно. Я полностью солидарен с Ziggi в этом вопросе. Нужно быть более гибким и подстраиваться под ситуацию, а не вбить себе в голову одну инструкцию и следовать ей.

¯\_(ツ)_/¯




Данные, которые не должны меняться, я просто не буду пытаться менять.

https://pp.vk.me/c630031/v630031638/4511c/nokP2e6XG7U.jpg

Что-то нет смысла продолжать весь этот срач спор, если ты не можешь принять тот факт, что неизменные данные должны быть неизменными.

Danny_Marcelo
11.07.2016, 03:19
В zcmd, dc_cmd и т.д. этот массив - атрибут, так сказать, команды. В твоей команде есть где-то объявление этого массива?

Я не углублялся в подробности других командных движков. Работаю только с командным и dc_cmd, да и большая часть аудитории работает именно с такими командными процессорами. Особенно dc_cmd.


Речь шла про использование case в switch().

Не понял, что конкретно не так сделал?


Лучше ведь тыкать наугад. Нуок.

Если я сказал подумаю, значит я не посчитал на диалогах такой уж и гениальной. т.к. всё равно по названию, ты не поймешь, какой это интерьер, пока не телепортируешься туда. Так что по сути, тоже будешь тыкать наугад. Поумнее что нибудь придумаю, выложу.


Ну тогда вопрос в другом, а нужна ли эта команда, если можно поискать нужный интерьер в интернете, для теста поставить игрока в этот интерьер и взять нужную позицию.

Я по моему уже писал выше, что многих интерьеров, которые есть в этой команде, нет в интернете. Ну если не веришь, удачи в поисках)
Я с помощью собейта и команды /setint искал. Выше уже писал, почему.

Desulaid
11.07.2016, 03:51
Если я сказал подумаю, значит я не посчитал на диалогах такой уж и гениальной. т.к. всё равно по названию, ты не поймешь, какой это интерьер, пока не телепортируешься туда. Так что по сути, тоже будешь тыкать наугад. Поумнее что нибудь придумаю, выложу.
Тут уже проблема в том, как ты опишешь название, а не в диалоге.

Sp1ke
11.07.2016, 04:40
Тут уже проблема в том, как ты опишешь название, а не в диалоге.

Ты сможешь удержать в голове 150 названий и помнить как выглядит интерьер, но не можешь запомнить ID?

DeimoS
11.07.2016, 09:33
Что-то нет смысла продолжать весь этот срач спор, если ты не можешь принять тот факт, что неизменные данные должны быть неизменными.

Говоря о солидарности с Ziggi, я говорил о варианте его кода без const. И я говорил о общей мании того, что если подобный массив объявить без const, то данные в нём обязательно попортят.
Хотя ладно, я изначально начал говорить не о том и признаю, нёс бред. Я пытался лишь озвучить своё мнение по поводу формулировки подачи информации вами и не более, поэтому действительно не стоит продолжать.

Почему все забили на вариант с кликабельными текстдравами? :с Никто не переходил по ссылке? Такой вариантгораздо удобнее всех диалогов будет же

ziggi
11.07.2016, 11:01
Почему все забили на вариант с кликабельными текстдравами? :с Никто не переходил по ссылке? Такой вариантгораздо удобнее всех диалогов будет же

Чем? Я разницы с диалогом не вижу, также неудобно. Как по мне, самым удобным вариантом является зайти на подобный сайт (https://pawnokit.com/Ru/Interiors) и посмотреть все интерьеры сразу со скриншотами.

DeimoS
11.07.2016, 13:10
Чем? Я разницы с диалогом не вижу, также неудобно. Как по мне, самым удобным вариантом является зайти на подобный сайт (https://pawnokit.com/Ru/Interiors) и посмотреть все интерьеры сразу со скриншотами.

В случае с диалогами трудно показывать большое число интерьеров одновременно. И если показать, например, 40 диалогов, из которых только 20 видны изначально (до остальных нужно список пролистывать), и теллепортироваться, например, в 39-ый, повторный показ диалога приведёт к тому, что пролистывание собьётся (список диалогов опять будет показан сначала).
В случае с кликабельными текстдравами такое не произойдёт и ты спокойно можешь хоть подряд каждый смотреть, наводя на названия мышкой (а с диалогами придётся каждый раз этот самый диалог закрывать).

В общем, посмотрите тот скрипт, который я кинул, и увидите о чём я говорю. Еслли реализовывать подобную систему через игру, имхо, лучше текстдравов ничего не найти

ziggi
11.07.2016, 14:01
В случае с диалогами трудно показывать большое число интерьеров одновременно. И если показать, например, 40 диалогов, из которых только 20 видны изначально (до остальных нужно список пролистывать), и теллепортироваться, например, в 39-ый, повторный показ диалога приведёт к тому, что пролистывание собьётся (список диалогов опять будет показан сначала).
В случае с кликабельными текстдравами такое не произойдёт и ты спокойно можешь хоть подряд каждый смотреть, наводя на названия мышкой (а с диалогами придётся каждый раз этот самый диалог закрывать).

В общем, посмотрите тот скрипт, который я кинул, и увидите о чём я говорю. Еслли реализовывать подобную систему через игру, имхо, лучше текстдравов ничего не найти

И правда, так будет удобнее.

Daniel_Cortez
11.07.2016, 16:49
Я понимаю о чём ты говоришь в целом, но как твои слова относятся конкретно к этому случаю? Когда все "минусы" распространяются лишь на администрацию, которая этой командой вдруг начнёт пользоваться, решит написать буквы вместо числа и её телепортирует по координатам, которые закреплены за нулевым ID.

Мои слова относятся к этому случаю в том плане, что в нём и оптимизировать-то особо нечего. То, что ты сделал, обычно называют "преждевременной оптимизацией". Ну откажешься ты от использования sscanf, в лучшем случае выиграешь пару-тройку микросекунд, общей картины это не изменит. Хотя можно было просто использовать sscanf2 и сэкономленное время потратить с куда большей пользой на оптимизацию того, что действительно нуждается в оптимизации.




По-моему, ты слишком преувеличиваешь сейчас...

Ты не видишь меры в том, что стоит оптимизировать, а что нет, да ещё и меняешь логику работы кода, чтобы достичь ещё большей "оптимизации", я лишь констатирую этот (очевидный) факт. О каком преувеличении здесь может идти речь?




Вариант "для паблика" и вариант "для себя" мало чем отличается. Это не как, например, написать программу с закрытым исходным кодом, но такими изощрёнными методами (дающими больший прирост к скорости), которые и поддерживать, и показывать кому-то страшно.
Нет. Просто когда я пишу "для себя", я использую "изощренные методы", которые хорошо известны мне и предназначение которых я прекрасно понимаю, которые я часто использую, и альтернативные ("правильные") варианты написания которых я так же прекрасно знаю. И мне не составит труда сделать то же самое, но "правильно", если это потребуется ситуацией.

Для паблика так тоже можно: если используешь что-то нестандартное, просто снабди комментарием, чтобы другим было понятно. Но, опять же, в меру.
В качестве примера приведу пару своих работ:

http://pro-pawn.ru/showthread.php?3243
Здесь в функции используется #emit для того, чтобы вместо двух операций деления с одинаковыми операндами оставить лишь одну и тем самым повысить производительность алгоритма.
В комментарии указан оригинальный код на Pawn и причина, по которой был использован тот трюк с #emit.

http://pro-pawn.ru/showthread.php?12837
Здесь тоже используется #emit, и не один раз. Это обусловлено тем, что куй объявил функцию SetPVarString без спецификатора const для параметра "varname", из-за чего просто невозможно перехватить BanEx без #emit, не нарушив совместимости.
Собственно, всё это так же можно найти в комментариях.





Как по мне, именно такого, более гибкого, подхода должен придерживаться каждый. Именно тогда это можно назвать творчеством и именно тогда это можно назвать более профессиональным подходом (знание всех аспектов написания определённой системы).

Так я и не говорил, что следует абсолютно всегда придерживаться шаблонных методов.




И тем меньше шансов придумать что-то поистине новое. Твой подход, как по мне, правилен для работы (для "серьёзного" программирования). Когда ты пишешь код для себя, что тебе мешает экспериментировать? Хуже, чем уже придумали, ты вряд ли сделаешь, если ты знаком с тем, что уже придумали и как к этому дошли. При этом, ты лучше поймёшь то, как до придуманного дошли и какие ещё есть варианты реализации того, над чем ты работаешь. В общем, по-моему, это и есть то самое творчество, о котором ты говоришь.

Для экспериментов можно делать отдельные небольшие работы, чтобы обкатывать новые техники программирования. В случае, если допустишь какую-то значительную ошибку или эта техника просто не оправдает себя, тебе не придётся тратить время на поиск и откат изменений в основном проекте.
Нужно уметь отличать какой-либо свой проект от "испытательного полигона". В крайнем случае, эксперименты можно проводить, реализуя с нуля отдельные модули проекта, но не в уже готовом и проверенном коде.

DeimoS
11.07.2016, 17:19
Мои слова относятся к этому случаю в том плане, что в нём и оптимизировать-то особо нечего. То, что ты сделал, обычно называют "преждевременной оптимизацией". Ну откажешься ты от использования sscanf, в лучшем случае выиграешь пару-тройку микросекунд, общей картины это не изменит. Хотя можно было просто использовать sscanf2 и сэкономленное время потратить с куда большей пользой на оптимизацию того, что действительно нуждается в оптимизации.

Отказ от sscanf идёт не во благо оптимизации, а во благо логики. Когда это стало нормальным использовать функции не по их предназначению? Или sscanf стала функцией проверки, записано ли в массив число или записан текст?




Ты не видишь меры в том, что стоит оптимизировать, а что нет, да ещё и меняешь логику работы кода, чтобы достичь ещё большей "оптимизации", я лишь констатирую этот (очевидный) факт. О каком преувеличении здесь может идти речь?

Опять же, ответ дан выше. Как, вроде, ты сам не так давно отвечал, оптимизация не только бывает в сторону скорости.




Так я и не говорил, что следует абсолютно всегда придерживаться шаблонных методов.

Только вот практически во всех случаях, когда я предлагаю мыслить нестандартно (с MAX_PLAYERS тем же), ты сразу пытаешься поставить контраргументом то, что так делать не принято и есть общепринятые нормы.




Для экспериментов можно делать отдельные небольшие работы, чтобы обкатывать новые техники программирования. В случае, если допустишь какую-то значительную ошибку или эта техника просто не оправдает себя, тебе не придётся тратить время на поиск и откат изменений в основном проекте.
Нужно уметь отличать какой-либо свой проект от "испытательного полигона". В крайнем случае, эксперименты можно проводить, реализуя с нуля отдельные модули проекта, но не в уже готовом и проверенном коде.

Хочется начать с того, что для меня Pawn и так является отдельным и небольшим "проектом", которым я занимаюсь чисто ради удовольствия.
Продолжить хочется тем, что когда дело доходит до какой-либо серьёзной работы или написания какой-либо статьи, я не использую какие-либо "новые техники".
"Новые техники" я использую лишь там, где это уместно. И, в том числе, в комментариях на форуме.
Хотя я бы не назвал новой техникой попытку сделать код более логически верным.

И да, раз уж всем тут плевать на логику, давайте и от forward откажемся, а будем просто дублировать public. Суть-то одна. Какая разница, логично это выглядит или нет?

Redsan
11.07.2016, 19:24
Ничего не хочу сказать, но подобную команду я видел ещё года 2-3 назад в одном из паблик модов (то ли Awesome DM, то ли какой-то подобный шлак).


В моде RakNet RP она была.

Daniel_Cortez
11.07.2016, 20:31
Отказ от sscanf идёт не во благо оптимизации, а во благо логики.

Добавление багов в алгоритм как-то слабо пересекается с логикой.




Когда это стало нормальным использовать функции не по их предназначению? Или sscanf стала функцией проверки, записано ли в массив число или записан текст?

Вообще-то это и есть то, что делает sscanf2: проверяет синтаксис параметров и считывает их.



Ты не видишь меры в том, что стоит оптимизировать, а что нет, да ещё и меняешь логику работы кода, чтобы достичь ещё большей "оптимизации", я лишь констатирую этот (очевидный) факт. О каком преувеличении здесь может идти речь?


Опять же, ответ дан выше.

Не совсем понял, о чём ты.




Только вот практически во всех случаях, когда я предлагаю мыслить нестандартно (с MAX_PLAYERS тем же), ты сразу пытаешься поставить контраргументом то, что так делать не принято и есть общепринятые нормы.

Да, потому что ты преподносишь порочные практики так, как будто это обычное дело, не поясняя перед этим, к чему они могут привести.
И мы же вроде уже разобрались по поводу того случая с MAX_PLAYERS(+1), нет?




"Новые техники" я использую лишь там, где это уместно. И, в том числе, в комментариях на форуме.

Т.е. ты предлагаешь другим то, в чём сам не до конца разбираешься?




И да, раз уж всем тут плевать на логику, давайте и от forward откажемся, а будем просто дублировать public. Суть-то одна. Какая разница, логично это выглядит или нет?

Ну если добавление неоднозначных ситуаций в алгоритм прокатило, то... почему бы и нет?!

Desulaid
11.07.2016, 20:55
Ты сможешь удержать в голове 150 названий и помнить как выглядит интерьер, но не можешь запомнить ID?

Удерживать-то в голове зачем? Зачем тыкать себе палки в колеса? Допустим, если структурировать диалог, то можно предположить, что будет что-то вроде:

Интерьеры квартир

Дом CJ на Groove Street
...


Интерьеры общепита
...


И можно сделать все это опционально. Допустим, если ввести /inter 4, то телепортируешься в четвертый интерьер, а если ввел просто /inter, то выпадает диалог со списком. Можно использовать меню (http://wiki.sa-mp.com/wiki/CreateMenu) для пролистывания интерьеров этой категории.

Danny_Marcelo
12.07.2016, 00:19
В моде RakNet RP она была.

Не знаю, где вы видели подобную команду, но я её делал сам. Да и многих интерьеров не найдёте в командах других. т.к. там в основном те, которые есть в интернете.

- - - Добавлено - - -


Удерживать-то в голове зачем? Зачем тыкать себе палки в колеса? Допустим, если структурировать диалог, то можно предположить, что будет что-то вроде:

Интерьеры квартир

Дом CJ на Groove Street
...


Интерьеры общепита
...



На счет вот этого, всё равно сложно будет разобраться, т.к.многие интерьеры придётся смотреть.


И можно сделать все это опционально. Допустим, если ввести /inter 4, то телепортируешься в четвертый интерьер, а если ввел просто /inter, то выпадает диалог со списком. Можно использовать меню (http://wiki.sa-mp.com/wiki/CreateMenu) для пролистывания интерьеров этой категории.



Вот эта идея понравилась очень. Как время будет, сделаю таким образом.

DeimoS
12.07.2016, 09:34
Добавление багов в алгоритм как-то слабо пересекается с логикой.

О каких багах идёт речь? То, что в случае ввода текста в переменную запишется нуль - это, по меркам SA-MP, скорее фича, чем баг. У команды есть описание и если ты его не придерживаешься - это исключительно твои проблемы, за которые ты "расплатишься" отправкой в интерьер под ID 0.
Да и, как сказал ранее, что мешает сдвинуть все ID на +1 и освободить нулевой ID? Тогда, при вводе текста и соответствующем условии в switch (default), ничего не произойдёт и игрока оповестят, что он ввёл неверный ID.
Если ты не понял, я не обсуждаю подобные "новые подходы" во всём программировании в целом. Я говорю конкретно об этом случае и обо всех остальных случаях в SA-MP.


Вообще-то это и есть то, что делает sscanf2: проверяет синтаксис параметров и считывает их.

И это является основной задачей функции? Давай тогда и с помощью MySQL переводить Unix время в обычный формат, узнавать это самое время и делать ещё кучу вещей, которые поддерживает MySQL. Она ведь это может



Не совсем понял, о чём ты.

О том, что я не говорю конкретно об оптимизации скорости. Основная цель - использование функций по их предназначению.
Вот ты говоришь, что в данном случае не так страшно использовать sscanf. Окей, все тебя слушают и продолжают извлекать sscanf'ом всего лишь 1 единственный параметр. В подобной команде это, возможно, и не страшно, но находится десяток умников, которые такие команды биндят на кнопку. И вот тут, при особо частом вызове, разница уже почувствуется (не говоря уже о том, что люди и в других местах, а не только в командах, начнут извлекать из массива с данными эти же самые данные).


Да, потому что ты преподносишь порочные практики так, как будто это обычное дело, не поясняя перед этим, к чему они могут привести.

Ни к чему страшному они привести не могут, в который раз повторяю. Да и я не статью пишу, где многократно продумываю все возможные исходы, а просто даю человеку совет (замечание). Дойдёт до этого время - опишу принципы работы sscanf и объясню в каких случаях её лучше использовать. Но пока нужно другими статьями заниматься.


И мы же вроде уже разобрались по поводу того случая с MAX_PLAYERS(+1), нет?
MAX_PLAYER_NAME*
И я о 4-х символах, которые нужны для серверных нужд, а не для нуль-символа. И о том, что при коннекте к серверу их можно не учитывать, объявляя массивы.



Т.е. ты предлагаешь другим то, в чём сам не до конца разбираешься?

"Новые техники" я для того и взял в кавычки, что в них нет ничего нового. Вытекающий "баг" известен всем, кто писал команды на стандартном командном процессоре. Это не что-то новое и будоражащее умы SA-MP сообщества, а заезженная тема.


Ну если добавление неоднозначных ситуаций в алгоритм прокатило, то... почему бы и нет?!

И опять, как мне кажется, ты путаешь написание обычной команды в SA-MP и написание чего-то более серьёзного.

Daniel_Cortez
12.07.2016, 15:53
О каких багах идёт речь? То, что в случае ввода текста в переменную запишется нуль - это, по меркам SA-MP, скорее фича, чем баг. У команды есть описание и если ты его не придерживаешься - это исключительно твои проблемы, за которые ты "расплатишься" отправкой в интерьер под ID 0.

Ну так давай вообще никакой ввод не будем проверять? Оставим везде неожиданное поведение, мультиплеер же и без того забагован до невозможности. Зато выиграем несколько микросекунд и это будет очень логично.




Да и, как сказал ранее, что мешает сдвинуть все ID на +1 и освободить нулевой ID? Тогда, при вводе текста и соответствующем условии в switch (default), ничего не произойдёт и игрока оповестят, что он ввёл неверный ID.
Если ты не понял, я не обсуждаю подобные "новые подходы" во всём программировании в целом. Я говорю конкретно об этом случае и обо всех остальных случаях в SA-MP.

Хорошо, допустим. Если исключить ту неоднозначную ситуацию при нуле, то это уже совсем другое дело: логика не нарушится, разницы между подходами со sscanf2 и strval практически не останется и утверждения об удобстве того или иного подхода будут не иначе как субъективны.




И это является основной задачей функции? Давай тогда и с помощью MySQL переводить Unix время в обычный формат, узнавать это самое время и делать ещё кучу вещей, которые поддерживает MySQL. Она ведь это может

Я чего-то не знаю про sscanf2? Ведь даже согласно словам Y_Less'а, основным предназначением плагина является проверка и считывание значений из строк.




О том, что я не говорю конкретно об оптимизации скорости. Основная цель - использование функций по их предназначению.

С каких пор использование sscanf2 в командах стало "не по назначению"?




Вот ты говоришь, что в данном случае не так страшно использовать sscanf. Окей, все тебя слушают и продолжают извлекать sscanf'ом всего лишь 1 единственный параметр. В подобной команде это, возможно, и не страшно, но находится десяток умников, которые такие команды биндят на кнопку. И вот тут, при особо частом вызове, разница уже почувствуется (не говоря уже о том, что люди и в других местах, а не только в командах, начнут извлекать из массива с данными эти же самые данные).

Разница будет не такой уж и большой на самом деле.

http://pro-pawn.ru/showthread.php?12585


#include <a_samp>
#include "../include/sscanf2.inc"

const PROFILER_ITERATIONS_MAJOR = 100_000;
const PROFILER_ITERATIONS_MINOR = 100;

new const code_snippets_names[][] =
{
{"strval (\"42\")"},
{"sscanf2 (\"42\")"},
{"strval (\"\")"},
{"sscanf2 (\"\")"},
{"strval (\"qwe\")"},
{"sscanf2 (\"qwe\")"}
};

#define Prerequisites();\
new x;

#define CodeSnippet0();\
x = strval("42");
#define CodeSnippet1();\
sscanf("42", "d", x);
#define CodeSnippet2();\
x = strval("");
#define CodeSnippet3();\
sscanf("", "d", x);
#define CodeSnippet4();\
x = strval("qwe");
#define CodeSnippet5();\
sscanf("qwe", "d", x);



Тестирование: 6 отрывков кода.
Режим: интерпретируемый, 100000x100 итераций.
strval ("42"): 1507
sscanf2 ("42"): 2166
strval (""): 960
sscanf2 (""): 1367
strval ("qwe"): 952
sscanf2 ("qwe"): 1850

Наибольшую разницу можно наблюдать при вводе строки вместо числа, но самая "нагруженная" ситуация возникает именно при правильном вводе числа.

А теперь представим ситуацию с флудом.
В SA-MP 0.3z R2 (http://pro-pawn.ru/showthread.php?6964) добавили в server.cfg переменную ackslimit, которая по умолчанию равняется 1000. Если кол-во сообщений от клиента к серверу за секунду превышает этот лимит, сервер разрывает связь с игроком.
Ок. Чтобы не превысить этот лимит, игрок стоит на месте и делает лишь по 800 вызовов команды в секунду.
В тесте использовалось 10 000 000 итераций, а значит для sscanf2 один вызов занимает 2166 / 10000000 ~= 0,0002166 с (~200 мкс), для strval - 0,0001507 с (~150 мкс).
При частоте в 800 команд в секунду при использовании sscanf2 сервер теряет 0,0002166 * 800 = 0,17328 с, со strval - 0,12056 c.
Если же взять 10 таких атакующих, то сервер окажется перегружен в обоих случаях. И это ещё без учёта того факта, что на сервере железо может оказаться куда слабже, чем используемое мной, особенно, когда на одной машине держится сразу несколько серверов SA-MP - тогда и одного атакующего может хватить, чтобы превысить определённый порог нагрузки, при котором хостинг просто отрубит процесс сервера. Время на приём команды сервером и её обработку командным процессором тоже не учитывалось (а если вместо командного процессора по старинке использовать strcmp, так это вообще беда: атакующий может просто "нащупать" одну из самых последних команд в OPCT и начать флудить ей, вызвав большое количество "ложных" вызовов strcmp).

Как бы то ни было, на OnPlayerCommandText можно поставить фильтр, который будет запоминать время последнего вызова команды каждым игроком и при достижении определённого кол-ва команд за промежуток времени отфильтровывать их.

DeimoS
12.07.2016, 16:58
Ну так давай вообще никакой ввод не будем проверять? Оставим везде неожиданное поведение, мультиплеер же и без того забагован до невозможности. Зато выиграем несколько микросекунд и это будет очень логично.

Не переходи в крайности. Я уже несколько раз сказал, что основная цель этого мероприятия - воцарение мира, спокойствия и логики.


Хорошо, допустим. Если исключить ту неоднозначную ситуацию при нуле, то это уже совсем другое дело: логика не нарушится, разницы между подходами со sscanf2 и strval практически не останется и утверждения об удобстве того или иного подхода будут не иначе как субъективны.

Я чего-то не знаю про sscanf2? Ведь даже согласно словам Y_Less'а, основным предназначением плагина является проверка и считывание значений из строк.

С каких пор использование sscanf2 в командах стало "не по назначению"?
Ну если ты считаешь нормальным вызывать функцию по обработки строки ради того, чтоб узнать, записано ли в неё число или нет... Тогда вопросов нет. Но, как по мне, подобный подход равносилен

format(string, sizeof(string)), "%s", string);

А если уж для тебя является аргументом лишь скорость обработки, то можно сделать подобный код

#define CodeSnippet0();\
sscanf(string, "i", lol);

#define CodeSnippet1();\
switch(string[0])\
{\
case '0'..'9': lol = strval(string);\
}
Если написать в команду, например, "121s" (представим, что просто опечатался), strval спокойно извлечёт "121", в отличии от sscanf.
И скорость обработки такой строки в обоих случаях будет, примерно, одинаковая (практически всегда в пользу второго варианта).
Так же и с "чистым" числом (то бишь, если указать просто "121").
А вот если первым символом указать букву, тут обычное условие прилично вырывается вперёд. Для красоты можно условие спрятать в соответствующий макрос или функцию, роль которого будет одна: определить, ввёл ли игрок число в качестве параметра команды или текст.

Хотя я, как уже говорилось ранее, являюсь противником sscanf (конкретно в подобной ситуации) чисто из-за того, что идёт "насилование" плагина ради всего одного параметра. Задачи стоит выполнять функциями, которые предназначены конкретно под эту задачу, а не функциями, в которых предусмотрена определённая реакция на определённое условие, но которые логичнее использовать в других обстоятельствах (и, в случае с sscanf - это обработка строк с целью разбивки тех на несколько частей (как основная функция)).


Ну а по поводу бинда соглашусь, погорячился (хоть и сам, перед тем ответом, прогонял оба варианта через твой профайлер, не особо вдумался в разницу результатов)


Я не говорю, что использование sscanf в подобных случаях - смертельно плохо. Но есть реализации, при которых и обработка будет быстрее (хоть разница и мала), и код логичнее будет смотреться.

Daniel_Cortez
12.07.2016, 17:52
Ну если ты считаешь нормальным вызывать функцию по обработки строки ради того, чтоб узнать, записано ли в неё число или нет...

Где я хоть раз сказал, что sscanf2 нужен только для проверки ввода? Покажи.





#define CodeSnippet0();\
sscanf(string, "i", lol);

#define CodeSnippet1();\
switch(string[0])\
{\
case '0'..'9': lol = strval(string);\
}

Нагромождение switch поверх strval может дать преимущество только в статических тестах. В реальных же условиях ошибки ввода могут совершаться не так часто, чтобы лишняя проверка стоила того.




Если написать в команду, например, "121s" (представим, что просто опечатался), strval спокойно извлечёт "121", в отличии от sscanf.

Спорный вариант в плане логики, число-то неправильное. Зависит от чьёго-либо конкретного мнения.




Я не говорю, что использование sscanf в подобных случаях - смертельно плохо. Но есть реализации, при которых и обработка будет быстрее (хоть разница и мала), и код логичнее будет смотреться.

Опять же, субъективное мнение. Сколько не утверждай, что strval выглядит "логичнее", найдётся кто-то (и не только я один), кому удобнее будет использовать то, что он использует обычно - sscanf2 - если только нет крайней необходимости выбрать что-то другое. Либо всё то же самое, только наоборот.
Если в обоих подходах нет значительных минусов, то каждый из них будет по-своему логичен.

DeimoS
12.07.2016, 18:45
Нагромождение switch поверх strval может дать преимущество только в статических тестах. В реальных же условиях ошибки ввода могут совершаться не так часто, чтобы лишняя проверка стоила того.

Лишняя проверка? Это практически та же самая проверка, что и в sscanf, только реализованная иначе и без "лишних" действий.


Спорный вариант в плане логики, число-то неправильное. Зависит от чьёго-либо конкретного мнения.

Если ставить целью написать ИДЕАЛЬНО работающий (чтоб прямо так, как задумано и чтоб ни шагу в "иную сторону" нельзя было ступить), то да, такой подход неверный. Но если ставить целью написать просто рабочую систему, которая, при этом будет удобна конечному "потребителю" (я говорю про случайные опечатки, которые sscanf не одобрит), то почему бы и нет? Игрок ведь не будет смотреть как у тебя реализован код. Ему лишь бы работало. А если работает не хуже и, при этом, без лишних действий, то почему бы и нет?

Ну а про субъективность говорить довольно странно. С таким подходом можно и транслит в именах переменных оправдывать (да и вообще всё): на производительность это никак не влияет, а то, что читаемость теряется - так это не для всех.

Daniel_Cortez
12.07.2016, 20:17
Лишняя проверка? Это практически та же самая проверка, что и в sscanf, только реализованная иначе и без "лишних" действий.
Да, лишняя, потому что в strval она тоже есть, если не брать тот факт, что strval просто возвращает 0 при ошибке.
Но с твоих же слов, ситуации с неправильным вводом и неправильным числом (больше верхней границы, ноль или отрицательное) можно подвести под вывод одного и того же сообщения об ошибке.
И именно поэтому преимущество будет только в статических тестах за счёт отсечки вызова нативной функции, если на входе каждый раз подавать неправильный ввод.
При правильном же вводе (например, то же "42") та проверка будет только замедлять алгоритм и разница со sscanf2 сократится.



Ну а про субъективность говорить довольно странно. С таким подходом можно и транслит в именах переменных оправдывать (да и вообще всё): на производительность это никак не влияет, а то, что читаемость теряется - так это не для всех.
Так что, будем признавать неправильными любые альтернативные понятия об удобстве и логике, не совпадающие с твоими?
Раз так, то вряд ли есть смысл продолжать сию дискуссию, если ты не способен принять допустимость существования иной точки зрения.

P.S.: Использование транслита на самом деле может быть оправдано, когда только начинаешь учить программирование, но не знаешь английский в достаточной мере. Например, меня (и уверен, многих других тоже) учили в школе программировать на Pascal с переменными и функциями, названными на транслите. Хоть я и не стал бы советовать это, как хорошую практику, поскольку мир не ограничен только этой страной, а международным языком традиционно считается английский. Впрочем, это лишь моё субъективное мнение, которое кто-то может посчитать глупым.

DeimoS
12.07.2016, 20:46
Да, лишняя, потому что в strval она тоже есть, если не брать тот факт, что strval просто возвращает 0 при ошибке.

Хмм, действительно. ¯\_(ツ)_/¯
С подобной проверкой и sscanf вырвется вперёд. Но я всё равно считаю, что использование sscanf в данной ситуации немного странно (хоть и не отрицаю, что вариант работает. Этого я никогда не отрицал). Всё зависит от конкретной ситуации и конкретных целей. И в данном случае, как я уже говорил, sscanf, как по мне, тут не к месту.


Но с твоих же слов, ситуации с неправильным вводом и неправильным числом (больше верхней границы, ноль или отрицательное) можно подвести под вывод одного и того же сообщения об ошибке.
И именно поэтому преимущество будет только в статических тестах за счёт отсечки вызова нативной функции, если на входе каждый раз подавать неправильный ввод.
При правильном же вводе (например, то же "42") та проверка будет только замедлять алгоритм и разница со sscanf2 сократится.

Да, дошло. Проверка явно лишняя


Так что, будем признавать неправильными любые альтернативные понятия об удобстве и логике, не совпадающие с твоими?

Я не прошу всех признавать их неправильными. Я лишь выразил свою точку зрения по поводу правильности подобного использования. Даже если бы ты тоже согласился с моей точкой зрения, число людей, продолжающих использовать sscanf подобным образом, никак бы не сократилось. То бишь, я пишу всё это без явной надежды всех и каждого переубедить.


Раз так, то вряд ли есть смысл продолжать сию дискуссию, если ты не способен принять допустимость существования иной точки зрения.

Я твою точку зрения понимаю и принимаю. Но не в случае этой и подобных этой команде (будь там, например, ID игрока, которые никак не "сдвинуть", тогда да, sscanf имеет смысл, ибо та же проверка на символы, но со стороны Pawn, будет в разы дольше. Только больше имеет смысл с его указателем "u"). Сдвинув ID телепортов, ты не приведёшь к какой-либо логической ошибке и не заставишь что-либо работать неправильно. Ты просто заставишь людей вводить не с 0 по 149, а с 1 по 150 (как сейчас, собственно, и сделано). И ничего, при этом, не потеряешь, кроме выигрыша в пару наносекунд (хоть и пара наносекунд, но лишними не будут, если учесть каким "трудом" они достались). Я не совсем пойму почему ты не можешь мыслить более свободно и считаешь подобный шаг чем-то смертельным (до sscanf люди, поди, вообще умирали). Я не прошу людей отказаться от sscanf вообще. Я советую им отказаться именно в этой ситуации, как и, например, в ситуации, когда в качестве единственного параметра является строка ("sscanf(params, "s[...], params)") и всё. Я прошу людей понимать смысл кода, который они пишут и делать его гибким, а не монотонно одинаковым лишь потому, что где-то без sscanf никак. Вот и всё, что я предлагаю.
Засим и закончим

Daniel_Cortez
12.07.2016, 23:49
Я не совсем пойму почему ты не можешь мыслить более свободно и считаешь подобный шаг чем-то смертельным (до sscanf люди, поди, вообще умирали).

Да ты просто донор сарказма.
Я умею свободно мыслить и не считаю твой подход "смертельным" (по крайней мере, пока он не вмешивается в логику самого алгоритма). Если сдвинуть ID на 1, то логика не будет затронута спецификой подхода, да и сложность использования не сильно отличается, так что способ вполне допустимый.
Но я всё же обычно использую sscanf2 для обработки параметров в командах - так почему бы не использовать его и в этой? Тем более, что в сравнении со strval разница в скорости выполнения незначительная.
Да, для меня логичней и удобней пользоваться тем, чем я пользуюсь всегда, если нет большой разницы в производительности и ситуация не критична к последней. В этом и состоит моя точка зрения.

Роуди.
13.07.2016, 00:52
Почему в этой темя Стяжкин мне напомнил Созонта ? :c

Desulaid
13.07.2016, 03:11
Почему в этой темя Стяжкин мне напомнил Созонта ? :c

У вас Созон головного мозга :blum3:))

Danny_Marcelo
16.10.2016, 15:54
Обновил тему. Огромное спасибо Ziggi за оптимизацию данной команды.

ziggi
16.10.2016, 16:41
if (sizeof(gTeleportPoints) <= interior_id < 0) {
Это не сработает должным образом.

Правильно так:

if (!(0 < interior_id <= sizeof(gTeleportPoints))) {

Danny_Marcelo
16.10.2016, 17:34
if (sizeof(gTeleportPoints) <= interior_id < 0) {
Это не сработает должным образом.

Правильно так:

if (!(0 < interior_id <= sizeof(gTeleportPoints))) {

Спасибо за исправление. Только что проверил в моде, действительно, писало "server uncnown command"

TheMallard
18.10.2016, 14:30
Интерьеры из interiors.txt?

Danny_Marcelo
23.10.2016, 13:44
Интерьеры из interiors.txt?

Да.

DeimoS
05.01.2017, 03:30
В идеале это всё лучше реализовать в виде кликабельных текстдравов. Как, например, есть скрипт со списком всех анимаций, растасованных по своим библиотекам, на текстдравах, опубликованный на официальном форуме (ссылко (http://forum.sa-mp.com/showthread.php?t=587916)). Будет гораздо удобнее искать нужный интерьер (особенно если каждый назовёшь подобающи и будешь выводить о каждом инфу в чат (ID интерьера и т.п.)). Тогда она будет действительно уникальна и полезна. А пока - так себе

Я всё же решился и реализовал идею с всеми интерьерами на кликабельных текстдравах, о которой говорил ранее.
За основу взял тот самый скрипт, о котором говорил (с разрешения автора), хоть и использовал оттуда, в основном, лишь текстдравы (код там не очень).
Вот что получилось, в итоге:

vk.com/video-117922339_456239021
Публиковать пока не буду, ибо нужно, как минимум, отловить все баги (один, с респавном, даже запечатлён на видео) + я хочу добавить в него ещё несколько вещей, таких как:

Фильтры - если придумаю как разбить все интерьеры на группы, то будет фильтр по группам (ну "интерьеры домов"/"интерьеры магазинов" и т.п.) + хочу попробовать реализовать фильтр по введённым символам, чтоб можно было искать нужный интерьер по названию или хотя бы по его части (ввёл "Am" и вывело все интерьеры, в которых есть буквосочетание "am").


Совместимость с плагином rustext (http://pro-pawn.ru/showthread.php?14309-rustext-%D1%80%D1%83%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D 1%86%D0%B8%D1%8F-%D0%B8%D0%B3%D1%80%D0%BE%D0%B2%D0%BE%D0%B3%D0%BE-%D1%82%D0%B5%D0%BA%D1%81%D1%82%D0%B0-%D0%B4%D0%BB%D1%8F-%D0%BC%D0%BD%D0%BE%D0%B6%D0%B5%D1%81%D1%82%D0%B2%D 0%B0-%D1%80%D1%83%D1%81%D0%B8%D1%84%D0%B8%D0%BA%D0%B0%D 1%82%D0%BE%D1%80%D0%BE%D0%B2&p=80949#post80949) (не знаю зачем. Просто хочу. Отстаньте).


Возможность сохранять координаты в файл в нужном формате (хоть в виде пикапа, хоть с функцией AddPlayerClass, хоть в какой-либо ещё)


Подправлю некоторые координаты (брал стандартные и некоторые спавнят за текстурами)


Возможно, прикручу что-то ещё (заодно и вы предлагайте, если идеи есть).

Вообще я хочу попробовать сделать инклуд, который бы позволял в эту "оболочку" из текстдравов запихивать совершенно любую информацию и после её обрабатывать (что уже частично реализовал), но не знаю, пригодится ли кому такое, ибо как-то двигать эту "оболочку" по экрану не получится (точнее, можно попытаться реализовать, но пока нет желания). Так что можете и по этому поводу сказать: нужно оно или нет.

И да, если есть у кого желание потестить скрипт - отпишитесь, скину и объясню как пользоваться.

P.S. Да простит меня модератор за то, что я поднял мёртвую тему (Oh, wait...)
Все обсуждения позже либо в курилку перенесу, либо в тему с релизом, либо удалю

$continue$
05.01.2017, 05:07
Не обязательно тпхать в интерьер. Сделал бы полет камеры в самом интерьере. Такую систему уже можно применить в покупке интерьера в дом на RolePlay модах

DeimoS
05.01.2017, 13:06
Не обязательно тпхать в интерьер. Сделал бы полет камеры в самом интерьере. Такую систему уже можно применить в покупке интерьера в дом на RolePlay модах

Моей целью было именно создание аналога сей команды для возможности впоследствии делать телепорты в интерьеры и т.п.
Но, при желании, можно всё легко переделать (координаты по новой подобрать и изменить около трёх строк).
Да и, как я уже сказал, я постараюсь реализовать инклуд, который позволит использовать эти текстдравы как оболочку, заполняя её по типу обычного диалога. То бишь:

ShowPlayerTextDrawBrowser(playerid, "Текст в шапке", "Пункт 1\nПункт 2\nПункт 3\nПункт 4\nПункт 5\n...\nПункт 100 (не длиннее ~20 символов каждый)", "Текст кнопки Exit", "Текст левой кнопки", "Текст средней кнопки", "Текст правой кнопки");
И обработка по типу диалогов, то бишь так (этот код уже есть в инклуде):

forward OnTextDrawListResponse(playerid, PlayerText:textdrawid, buttom, listitem, inputtext[]);
public OnTextDrawListResponse(playerid, PlayerText:textdrawid, buttom, listitem, inputtext[])
{
switch(buttom)// Так можно отловить нажатие каждой из кнопок текстдрава
{
case BUTTOM_LIST:
{
}
case BUTTOM_SELECT_PAGE:
{
}
case BUTTOM_PAGE:
{
}
case BUTTOM_ARRAY_DOWN:
{
}
case BUTTOM_ARRAY_UP:
{
}
case BUTTOM_CENTER:
{
}
case BUTTOM_RIGHT:
{
}
case BUTTOM_LEFT:
{
}
case BUTTOM_EXIT:
{
}
}
return 1;
}
Но, как я уже сказал ранее, нужно сначала отловить все баги + допилить некоторые совместимости и подправить все названия, ибо сейчас я их максимально короткими и простыми делал (в FS такое ещё может прокатить, но для инклуда это непростительно).
К этому всему, соответственно, будут функции по изменению текста в каждой из кнопок и т.п. То бишь, полная настройка и контроль всего, что происходит в текстдравах.

vovandolg
05.01.2017, 20:28
хм хм)) с аним листа TD выдрал или просто свою версию сделал?)

[ForD]
05.01.2017, 20:43
хм хм)) с аним листа TD выдрал или просто свою версию сделал?)


За основу взял тот самый скрипт, о котором говорил (с разрешения автора), хоть и использовал оттуда, в основном, лишь текстдравы (код там не очень).

:-\

123
06.01.2017, 09:44
Моей целью было именно создание аналога сей команды для возможности впоследствии делать телепорты в интерьеры и т.п.
Но, при желании, можно всё легко переделать (координаты по новой подобрать и изменить около трёх строк).
Да и, как я уже сказал, я постараюсь реализовать инклуд, который позволит использовать эти текстдравы как оболочку, заполняя её по типу обычного диалога. То бишь:

ShowPlayerTextDrawBrowser(playerid, "Текст в шапке", "Пункт 1\nПункт 2\nПункт 3\nПункт 4\nПункт 5\n...\nПункт 100 (не длиннее ~20 символов каждый)", "Текст кнопки Exit", "Текст левой кнопки", "Текст средней кнопки", "Текст правой кнопки");
И обработка по типу диалогов, то бишь так (этот код уже есть в инклуде):

forward OnTextDrawListResponse(playerid, PlayerText:textdrawid, buttom, listitem, inputtext[]);
public OnTextDrawListResponse(playerid, PlayerText:textdrawid, buttom, listitem, inputtext[])
{
switch(buttom)// Так можно отловить нажатие каждой из кнопок текстдрава
{
case BUTTOM_LIST:
{
}
case BUTTOM_SELECT_PAGE:
{
}
case BUTTOM_PAGE:
{
}
case BUTTOM_ARRAY_DOWN:
{
}
case BUTTOM_ARRAY_UP:
{
}
case BUTTOM_CENTER:
{
}
case BUTTOM_RIGHT:
{
}
case BUTTOM_LEFT:
{
}
case BUTTOM_EXIT:
{
}
}
return 1;
}
Но, как я уже сказал ранее, нужно сначала отловить все баги + допилить некоторые совместимости и подправить все названия, ибо сейчас я их максимально короткими и простыми делал (в FS такое ещё может прокатить, но для инклуда это непростительно).
К этому всему, соответственно, будут функции по изменению текста в каждой из кнопок и т.п. То бишь, полная настройка и контроль всего, что происходит в текстдравах.

Идея, конечно, хорошая. Только не понятно как в ShowPlayerTextDrawBrowser вместятся все 100 кнопок..

DeimoS
06.01.2017, 13:37
Идея, конечно, хорошая. Только не понятно как в ShowPlayerTextDrawBrowser вместятся все 100 кнопок..

Не 100 кнопок, а 100 пунктов (то место, где сейчас находятся названия интерьеров). Это число можно будет настраивать (текст пунктов будет хранится в двумерном массиве и эта настройка как раз будет влиять на размер этого массива. Хотя есть немного другая идея для реализации, но её нужно проверить).

Dorian
16.09.2017, 10:25
1:0 в пользу s0beit :i-m_so_happy:.

1:0 в пользу команду автора. А почему? Потому, что не знаю как у других, у меня лично при выборе любой локации в собейте вылетает GTA. Так что я лучше потыкаю рандомно.

А автору спасибо за команду, но все же действительно думаю можно было бы резализовать это более красивее, на диалогах или текстрайвах.